optional空值判断
总览
在Java 8中,您可以返回Optional而不是返回null。 就像您在Java 7中所做的那样。这可能会有所不同,这取决于您是否倾向于忘记检查null还是使用静态代码分析来检查nullalbe引用。
但是,还有一种更引人注目的情况是将Optional视为具有0或1值的Stream。
简单的可选用例
在Java 7的旧时代中,您将编写如下内容:
String text = something();
if (text != null) {
注意: Oracle Java 7将在2015年4月“公开更新结束”。
使用Optional可以编写:
Optional text = something();
if (text.isPresent()) {String text2 = text.get();
但是,如果您偏执狂,您可能会写。
Optional text = something();
if (text != null && text.isPresent()) {String text2 = text.get();
如果您的项目中经常出现NullPointerException错误,则Optional可能会有所帮助,但否则看起来并没有太大帮助。
一个更复杂的例子
让我们考虑一下这个例子
static String getFirstSecondThird(Nested nested) {try {return ((Contained2) nested.first.second).get(0).third;} catch (NullPointerException | ClassCastException | IndexOutOfBoundsException ignored) {return null;}
}
这真的很丑。 您可以构建一长串条件检查,而不是捕获异常,但要查看要执行的操作却变得非常困难。
可选允许您处理所有可能的错误情况,而无需使用Exception或嵌套的if / else逻辑。
static Optional getFirstSecondThird(Optional nested) {return nested // could be non-present.map(x -> x.first) // could be null.map(x -> x.second) // could be null// could be another type.map(x -> x instanceof Contained2 ? (Contained2) x : null).map(x -> x.list) // could be null.filter(x -> !x.isEmpty()) // could be empty.map(x -> x.get(0)) // could be null.map(x -> x.third); // could be null.
}
我们得到的是一系列映射和过滤器,它们只有在值非空且存在的情况下才进行。 如果任何值为null或过滤器为true,则整个结果为“不存在”。
结论
使用Optional是一种以安全的方式导航复杂数据结构的有效方法。 Lambda的目的是减少样板代码,并在这种情况下避免了所有检查或错误。
额外
为了您的兴趣,这是我在上面的示例中使用的类。
static class Nested {Contained first;
}static class Contained {IContained2 second;
}interface IContained2 {
}static class Contained2 implements IContained2 {List list;
}static class Data {String third;
}
翻译自: https://www.javacodegeeks.com/2015/02/java-8-optional-is-not-just-for-replacing-a-null-value.html
optional空值判断