Java Optional 最佳实践
为什么需要Optional隐藏空指针不确定性
Optional
隐藏了可能存在空指针的不确定性,比如:
List<String> numbers= ImmutableList.of("ONE", "TWO", "THREE");
return numbers.stream()
.filter(number -> "FOUR".equals(number))
.findAny()
.toLoweCase();
结果会导致 NullPointerExceptions
空指针错误,而使用 if else
进行判断是一种切割器cutter味道:
List<String> numbers= ImmutableList.of("ONE", "TWO", "THREE");
String numberThatImLookingFour =
numbers.stream()
.filter(number -> "FOUR".equals(number))
.findAny();
if(numberThatImLookingFour != null){
return numberThatImLookingFour.toLowerCase();
}else{
return "not found";
}
所以, 我们的目的是为库方法的返回类型提供一种有限的机制,其中需要一种明确的方式来表示“无结果”,并且对于这样的方法使用null绝对可能导致错误。
因此添加了Optional <T>
,这不是一个真正的新概念,历史可以追溯到Haskell的Maybe monad。突然间,我们获得了JDK批准的表示可能存在或不存在的值的方式,和往常一样,在各地使用新功能的开发人员抓狂了。
空引用空指针是无数个错误的来源,通常也不能很好地标识“不存在”这个概念。
应该如何处理这个问题的重要部分来自DDD。在有界上下文的入口处我们说:’ 你不能通过 ':
传入领域的所有变量是执行业务逻辑所需的,我们必须减少编写if(obj == null)检查判断的代码行数量。我们仍然需要与外部世界(数据库查询,REST端点等)进行交互,并根据执行的逻辑交互输出。如果使用Optional 得当则可以提供帮助。
什么是Optional?
它是box类型ÿ