说明:Optional和Stream一样,是Java8引入的特性,本文介绍Optional的几个实际用法。Steam流使用,参考下面这篇文章:
- Stream流使用
使用
1.保证值存在
// 1.保证值存在,pageNumber,pageSizeInteger pageNumber = null;Integer pageSize = null;pageNumber = Optional.ofNullable(pageNumber).orElse(1);pageSize = Optional.ofNullable(pageSize).orElse(10);System.out.println("pageNumber = " + pageNumber + ", pageSize = " + pageSize);
2.保证值合法
// 2.保证值合法Integer id = -1;id = Optional.ofNullable(id).filter(e -> e > 0).orElse(1);System.out.println("id = " + id);// 或,不合法时抛出异常id = -1;Optional.ofNullable(id).filter(e -> e > 0).orElseThrow(() -> new IllegalArgumentException("id必须大于0"));
3.避免多次空判断
有时我们想获取一个对象中的对象的对象的值,如下:
Country country = new Country("中国", "100001");Address address = new Address("北京", "北京市", "长安街", "北京市长安街", country);Student student = new Student("001", "张三", "男", 18, address);
学生对象中有地址对象,地址对象中有国家对象,当我们要获取该学生的国家名称时,常规情况,我们需要这样:
// 3.获取该学生的国家名称if (student != null) {Address address1 = student.getAddress();if (address1 != null) {Country country1 = address1.getCountry();if (country1 != null) {String name = country1.getName();if (name != null) {System.out.println("name = " + name);} else {System.out.println("未知");}}}}
使用Optional就很方便
// 使用OptionalString name = Optional.ofNullable(student).map(Student::getAddress).map(Address::getCountry).map(Country::getName).orElse("未知");System.out.println("name = " + name);
总结
以上三个例子,来自阿里云藏经阁电子书《Java工程师必读手册》P294~295,地址如下:
- 电子书《Java工程师必读手册》地址:https://developer.aliyun.com/ebook/7780