![python空值怎么表示](https://i-blog.csdnimg.cn/blog_migrate/26fb0b5b5bfee16b061a9677f58ca8e0.png)
python空值怎么表示
总览
在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
python空值怎么表示