Java8 Optional总结
来源:互联网 发布:access数据库下载 编辑:程序博客网 时间:2024/06/03 10:30
1、构造方式
Optional 的三种构造方式: Optional.of(obj), Optional.ofNullable(obj) 和 Optional.empty()1.1、Optional.of(obj)
它要求传入的 obj 不能是 null 值的, 否则 NullPointerException.
使用场景:1. 当我们非常非常的明确将要传给 Optional.of(obj) 的 obj 参数不可能为 null 时;
2. 当obj 为 null 立即报告 NullPointException 异常, 而不是隐藏空指针异常时.
1.2、Optional.ofNullable(obj)
传 null 进到就得到 Optional.empty(), 非 null 就调用 Optional.of(obj).
1.3、Optional.empty()
内部value是null
2、不推荐的使用方式
Optional<User> user = ……if (user.isPresent()) {return user.getOrders();} else {return Collections.emptyList();}
这种方式和我们直接使用obj != null做判断没什么区别。实际上,当我们还在以如下几种方式使用 Optional 时, 就说明你的使用方式可能有问题:
(1)调用 isPresent() 方法时或者调用 get() 方法时。这两种方法应该认为是private的,你最好不要直接使用。
(2)Optional 类型作为类/实例属性时。Optional 类型不可被序列化, 用作字段类型会出问题
(3)Optional 类型作为方法参数时。
3、正确的使用方式
Optional 中我们真正可依赖的应该是除了 isPresent() 和 get() 的其他方法:public<U> Optional<U> map(Function<? super T, ? extends U> mapper)public T orElse(T other)public T orElseGet(Supplier<? extends T> other)public void ifPresent(Consumer<? super T> consumer)public Optional<T> filter(Predicate<? super T> predicate)public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
3.1、存在则返回数据
3.1.1、orElse
存在即返回, 无则提供默认值
return user.orElse(null);return user.orElse(UNKNOWN_USER);
3.1.2、orElseGet
存在即返回, 无则由函数来产生
return user.orElseGet(() -> fetchAUserFromDatabase());3.1.3、orElseThrow
存在即返回, 无则抛出supplier接口创建的异常。
try {empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
System.out.println(ex.getMessage());
}
3.2、存在则执行某个动作
3.2.1、ifPresent
存在才对它做点什么
user.ifPresent(System.out::println);//等同于
if (user.isPresent()) {
System.out.println(user.get());
}
3.3、存在则转换成另一个Optional
3.3.1、map
public<U> Optional<U> map(Function<? super T, ? extends U> mapper)如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
Optional<String> name2 = Optional.of("deff");Optional<String> s = name2.map((value) -> value.toUpperCase());System.out.println(s.orElse("No value found"));//DEFF Optional<String> name2 = Optional.ofNullable(null);Optional<String> s = name2.map((value) -> value.toUpperCase());System.out.println(s.orElse("No value found"));//No value found
//之前的做法
if(user.isPresent()) {
return user.get().toUpperCase();
} else {
return Collections.emptyList();
}
map 是可能无限级联的, 比如再深一层, 获得用户名的大写形式
return user.map(u -> u.getUsername())
.map(name -> name.toUpperCase())
.orElse(null);
3.3.2、flatMap
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。
flatMap与map(Funtion)方法类似,区别在于传入方法的lambda表达式的返回类型。
map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
Optional<String> name = Optional.of("Abc");Optional<String> upperName = name.flatMap((value) -> Optional.of(value.toUpperCase()));System.out.println(upperName.orElse("No value found"));//ABC
3.5、存在则做过滤
3.5.1、filter
检查给定的Option值是否满足某些条件。如果满足则返回同一个Option实例,否则返回空Optional。
Optional<String> longName = name.filter((value) -> value.length() > 6)
4、总结:
用了 isPresent() 处理 NullPointerException 不叫优雅, 有了 orElse, orElseGet 等, 特别是 map 方法才叫优雅.使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等这样的方法
阅读全文
0 0
- Java8 Optional总结
- Java8-optional
- java8 Optional
- Java8 Optional
- Java8中的Optional类
- java8系列之Optional
- java8 Optional类
- Java8 Optional类
- Java8 Optional类
- Java8 Optional剖析
- JAVA8 Optional类
- Java8 Optional(二)
- Optional-java8特性
- Java8 Optional使用
- Java8-Optional-No.01
- Java8-Optional-No.02
- java8新特性--optional
- java8 Optional使用demo
- 美国专利商标局审批通过美国银行加密货币交易所专利
- 韩国对比特币交易采取新的限制措施
- 保加利亚高校成立比特币奖学金
- 深脑链,为人工智能时代提供算力与数据支持
- 日本GMO互联网集团推出比特币薪资管理系统
- Java8 Optional总结
- Eureka 源码解析 —— Eureka源码解析 —— 应用实例注册发现 (九)之岁月是把萌萌的读写锁
- linux下安装mysql
- 沙特央行与阿联酋央行联手测试加密货币
- Java使用HttpURLConnection发送POST和GET请求
- bootstrap-select 通过拼音搜索汉字下拉框方法
- 整数逆序
- Json的序列化与反序列化的问题c#
- PostgreSQL配置文件--WAL