如何使用Optional类| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:如何使用Optional类?

使用Java8已经6个多月了,我对新的API变化非常满意。但我仍然不确定的一个方面是何时使用Optional类。我想在任何地方都使用它,但我不确定这种方式是不是好的?

似乎有很多情况下我可以使用它,我从来没有确定它是否增加了好处(可读性/空安全性)或只是导致额外的开销。

所以,我举了几个例子,我很感兴趣你们是否认认为Optional对于代码是有益的?

  1. 当返回值可能为null
public Optional<Foo> findFoo(String id);
复制代码
  1. 当参数为null
public Foo doSomething(String id, Optional<Bar> barOptional);
复制代码
  1. 作为某个bean的成员
public class Book {

  private List<Pages> pages;
  private Optional<Index> index;

}
复制代码
  1. 放在集合中
List<Optional<Foo>>
复制代码

但是Optonal在集合中有什么好的用途吗?

热门回答

Optional的主要设计目标是为返回值的函数提供一种表示没有返回值的方法。这允许调用方继续一系列fluent方法调用。

这与OP问题中的用例1最为接近。尽管如此,缺少值比null更精确,因为类似IntStream.findFirst的东西永远不会返回null

对于用例2,将Optional传递给一个方法,这是可行的,但是相当笨拙。假设你有一个方法,该方法接受一个字符串,后面跟一个Optional类型的第二个字符串。接受Optional作为第二个参数将导致如下情况:

foo("bar", Optional.of("baz"));
foo("bar", Optional.empty());
复制代码

甚至接受一个null要更加好一些

foo("bar", "baz");
foo("bar", null);
复制代码

最好的办法使用重载,该方法接受单个字符串参数,并为第二个参数提供默认值:

foo("bar", "baz");
foo("bar");
复制代码

这确实有局限性,但它比上述任何一种都好。

用例#3和#4,在类字段或集合中使用Optional,被认为是对API的滥用。首先,它违背了Optional主要设计目标,如顶部所述。第二,它没有增加任何价值。

我相信有些人可能会想出一些人为的例子,他们真的想在字段或集合中存储Optional,但一般来说,最好避免这样做。

文章翻译自Stack Overflow:stackoverflow.com/questions/2…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享