总览

在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

Java 8 Optional不仅用于替换空值相关推荐

  1. optional空值判断_Java 8 Optional不仅用于替换空值

    optional空值判断 总览 在Java 8中,您可以返回Optional而不是返回null. 就像您在Java 7中所做的那样.这可能会有所不同,这取决于您是否倾向于忘记检查null还是使用静态代 ...

  2. Java:如何更优雅的处理空值?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:lrwinx https://lrwinx.github.i ...

  3. Java 8 - Optional全解

    文章目录 在Optional出现之前经常遇到的空指针异常 采用防御式减少NullPointerException (深度质疑) null-安全的第二种尝试(过多的退出语句) Optional的介绍以及 ...

  4. 【Java】Optional容器

    说明 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者 ...

  5. Java 8 - Optional Class可选类

    Java 8 - Optional Class可选类 1 Java 8-概述 2 Java 8 - Lambda表达式 3 Java 8 - 方法引用 4 Java8-Functional Inter ...

  6. JAVA高级——Optional

    JAVA高级--Optional 二.为何要避免null指针 三.使用Optional优化null判断 3.1.1 使用Optional优化Car类 3.1.2 Optional的几种模式 3.1.3 ...

  7. 使用Java 8 Optional避免空指针异常

    2019独角兽企业重金招聘Python工程师标准>>> Optional可以让你的代码具有可读性,且会避免出现空指针异常. 都说没有遇到过空指针异常的程序员不是Java程序员,nul ...

  8. Java 8 - Optional实战

    文章目录 Pre 用 Optional 封装可能为 null 的值 异常与 Optional 的对比 避免使用基本类型的Optional对象 Pre Java 8 - Optional全解相信你已经了 ...

  9. Java 8 Optional 类

    Java 8 Optional 类  Java 8 新特性 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. ...

最新文章

  1. python制作工资计算器-Python制作个税计算器
  2. 雷人的调查:荷兰女性的安全意识
  3. 高级工程师必须精通的七种武器(摘录)
  4. Apache ab测试工具使用方法(无参、get传参、post传参)
  5. 一种数据结构 跳表skiplist
  6. 使用Azure DevOps持续集成GitHub项目
  7. php程序xml有必要学习吗,对初学者非常有用的PHP技巧
  8. javascript Date object
  9. 甘肃刘家峡赤壁“结”出多彩冰瀑
  10. MPEG4 协议详解
  11. 怎样在nature上查文献?
  12. 树莓派4支持多大tf卡_树莓派入门指南(Raspberry Pi)
  13. java实现鼠标宏编程_对键盘鼠标宏处理--按键精灵让我们不要重复工作
  14. 荐书一本-----《天才在左,疯子在右》
  15. JS中根据入职时间计算工龄
  16. 如何评价微软在数据中心使用FPGA代替传统CPU的做法?
  17. Excel IF 函数怎么用
  18. 英特尔应用服务器,英特尔(Intel)服务器CPU全解析(图)
  19. pandas用groupby后对层级索引levels的处理
  20. OSChina 元宵节乱弹 ——青龙偃月刀都实名了

热门文章

  1. ssh(Spring+Spring mvc+hibernate)——Dept.hbm.xml
  2. java实现人脸识别源码【含测试效果图】——DaoImpl层(BaseDaoUtilImpl)
  3. Mybatis+mysql动态分页查询数据案例——房屋信息的接口(IHouseDao)
  4. mfc定义了变量仍提示未定义标识符_JavaScript-变量
  5. mysql如何分析sql执行效率和进行效率优化
  6. ibatis(2)ibatis是什么
  7. cassandra 备份_使用sstableloader恢复Cassandra Priam备份
  8. graal java_使用SparkJava和Graal的本机微服务
  9. 使用ArchUnit验证代码和体系结构约束
  10. spring jms 事务_Spring JMS:处理事务中的消息