一、概述
现在使用Java 8已有很长时间,我对新的API更改感到非常满意。我仍然不知道的一个知识点是什么时候使用Optional
。我似乎在想要在可能存在的null的
任何地方都使用它。
我似乎可以在许多情况下使用它,但我不确定它是否会带来好处(可读性/null安全性)或仅仅是造成额外的开销。
1-作为方法可以返回时的公共方法返回类型null
:
public Optional findFoo(String id);
2-作为参数的方法参数时,参数可能是null
:
public Foo doSomething(String id, Optional barOptional);
3-作为bean的可选成员:
public class Book {
private List pages;
private Optional index;
}
4-在Collections
:
总的来说,我不认为:
List>
添加任何东西-尤其是因为可以filter()
删除null
值等,但是Optional
in集合有什么好的用处吗?
二、详解
Optional
的要点是为函数返回值提供一种手段,以指示不存在返回值。
这与OP问题中的用例#1最接近。虽然,缺少值比空值更为精确,因为类似这样的IntStream.findFirst
值永远不会返回null。
对于用例2,将可选参数传递给方法,可以使之起作用,但这相当笨拙。假设您有一个方法,该方法接受一个字符串,然后是一个可选的第二个字符串。接受Optional
as作为第二个arg将导致如下代码:
foo("bar", Optional.of("baz"));
foo("bar", Optional.empty());
甚至接受null也会更好:
foo("bar", "baz");
foo("bar", null);
最好的办法是拥有一个重载的方法,该方法接受单个字符串参数并为第二个提供默认值:
foo("bar", "baz");
foo("bar");
这确实有局限性,但是比以上任何一个都好。
在类字段或数据结构中具有的用例#3和#4Optional
被视为对API的滥用。首先,它违反Optional
了顶部所述的主要设计目标。其次,它不会增加任何价值。
可以使用三种方法来处理缺少值的情况Optional
:提供替代值,调用函数以提供替代值或引发异常。如果要存储到字段中,则可以在初始化或分配时执行此操作。如果要将值添加到列表中(如OP所述),则可以选择不添加值,从而“拉平”缺少的值。
我确信有人可以提出一些他们确实想Optional
在字段或集合中存储的人为设计的案例,但是总的来说,最好避免这样做。
如若转载,请注明出处:https://www.javaidea.cn/article/8296.html