Fai*_*lde 14 java functional-programming optional java-8
有人可以解释一下Optional
我们如何避免NullPointerException
吗?
Optional<String> op = someFunc()
if(op.isPresent()) {
op.get();
}
String possibleNull = op.get();
Run Code Online (Sandbox Code Playgroud)
这个代码不是很容易出现NullPointerException
吗?如果是这样,那么为什么这个代码更受欢迎
String op = someFunc()
if(op != null) {
op.get();
}
String possibleNull = op;
Run Code Online (Sandbox Code Playgroud)
Optional
除了帮助我们了解函数是否实际具有返回值之外,还有什么可能带来的好处
Stu*_*rks 27
假设您想要获取函数返回的字符串,将其转换为大写,然后将其打印出来.如果你有:
String someFunc() { ... }
Run Code Online (Sandbox Code Playgroud)
你可能想写:
System.out.println(someFunc().toUpperCase());
Run Code Online (Sandbox Code Playgroud)
当然,NullPointerException
如果someFunc
返回则会抛出null
.相反,假设我们有这个:
Optional<String> someFunc() { ... }
Run Code Online (Sandbox Code Playgroud)
然后
System.out.println(someFunc().toUpperCase());
Run Code Online (Sandbox Code Playgroud)
不起作用,因为Optional
没有toUpperCase
方法.在这一点 - 希望 - 你会遇到一个Optional
,这应该让你考虑Optional
空虚的情况.这有助于避免NPE,但可能只是在某种程度上.
现在你可能会专注于如何从中获取价值Optional
,你可能会忘记空案例.啊,有一种get
方法:
System.out.println(someFunc().get().toUpperCase());
Run Code Online (Sandbox Code Playgroud)
这带来了与NPE相同的问题,除了异常NoSuchElementException
.因此,如果你盲目地调用get
一个Optional
,它实际上与在引用上调用方法而不检查它是否为空非常相似.
(出于这个原因,Brian Goetz认为Optional.get
是Java 8中最大的错误.在大约16分钟的时间里,看看他对Angelika Langer JAX 2015 Fragen und Antworten zu Java 8的采访.我不确定它是最大的,但它是一个人们只是不希望get
抛出异常.)
如果您正在努力检查空引用或空选项,那么
Optional<String> os = someFunc();
if (os.isPresent()) {
System.out.println(os.get().toUpperCase());
}
Run Code Online (Sandbox Code Playgroud)
几乎没有比旧的好
String s = someFunc();
if (s != null) {
System.out.println(s.toUpperCase());
}
Run Code Online (Sandbox Code Playgroud)
在真正的优势Optional
是,它是一个库类,它具有处理以安全的方式空的情况下相当丰富的API.通常可以Optional
通过将一些方法调用链接到Optional
首先返回的方法来处理可能包含在其中的值.例如,我们可以按如下方式重写上面的示例:
someFunc().map(String::toUpperCase)
.ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11515 次 |
最近记录: |