加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Optional orElse() 和 orElseGet() Optional.flatMap()和

发布时间:2020-12-15 07:23:01 所属栏目:Java 来源:网络整理
导读:Java Optional 的 orElse() 和 orElseGet() 的区别 1. 接收的参数不同 orElse() 方法以一个自定义类型的数据作为参数 public T orElse ( T t ) orElseGet() 方法以一个 Supplier 类型的数据作为参数 public T orElseGet ( Supplier ? extends T other ) 2.

Java Optional 的 orElse() 和 orElseGet() 的区别

1. 接收的参数不同

orElse()方法以一个自定义类型的数据作为参数

public T orElse(T t) 

orElseGet()方法以一个Supplier类型的数据作为参数

public T orElseGet(Supplier<? extends T> other) 

2. 程序的执行过程不同

以下面一段代码为例:

public static void main(String[] args) { String[] names = new String[]{"zhang","wang","li","zhao","wu"}; Optional.of("wang").orElse(getRandomName(names)); // 执行该句时会打印"Generating a name..." Optional.of("wang").orElseGet(() -> getRandomName(names)); } public static String getRandomName(String[] names) { System.out.println("Generating a name..."); Random random = new Random(); return names[random.nextInt(5)]; } 

在上述代码在运行Optional.of("wang").orElse(getRandomName(names))时会打印"Generating a name...",而在运行Optional.of("wang").orElseGet(() -> getRandomName(names))时没有任何输出,这说明了orElse()中的函数getRandomName被调用了,而orElseGet()中的Lambda表达式没有执行。

产生上述现象的原因是,无论Optional对象中的值是否为空,orElse()函数都会执行;而由于orElseGet()中的参数为一个Supplier方法,该方法的特点是仅在必要的时候执行,因此只有在Optional对象中的值为空时,orElseGet()中的Supplier方法才会执行。

3. 性能差异

由于orElse()orElseGet()执行过程的差异,orElseGet()方法的执行效率相对而言也更快,这是因为他会跳过不必要的方法调用。

因此,只有当默认值已经事先定义的情况下,才使用orElse(),否则使用orElseGet()更好

?

=================================================================================

?

使用map函数返回对象,使用flatMap返回Optional。例如:

public static void main(String[] args) { Optional<String> s = Optional.of("input"); System.out.println(s.map(Test::getOutput)); System.out.println(s.flatMap(Test::getOutputOpt)); } static Optional<String> getOutputOpt(String input) { return input == null ? Optional.empty() : Optional.of("output for " + input); } static String getOutput(String input) { return input == null ? null : "output for " + input; } 

这两个语句输出相同的东西。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读