在函数式语言中,通常在可选类型上使用模式匹配:
let result = match myOptional with | Some x -> x * 2 | None -> 0
这对程序员非常有帮助,因为编译器检查模式匹配是否完整.
然而,在Java的例子Optional
,我所看到的,isPresent
并且get
被用来代替:
Integer result; if (myOptional.isPresent()) { result = myOptional.get() * 2; } else { result = 0; }
对我来说,这违背了目的Optional
.编译器不进行检查以确保if
正确实现了它们的两个分支,并且生成的代码没有比使用等效代码更多的保证null
.
这种设计选择阻碍了安全性,那么为什么标准库提供的get
功能不仅仅是match
?
这是通过该Optional::map
方法完成的.你的例子可以写成:
Integer result = myOptional.map(i -> i * 2).orElse(0);
关于这个get
方法,有一个讨论要弃用它 - 我不确定是否已经达成了一个决定.