代码里面很多判空,if (a==null) 很多问题,但是不判空,问题更多,会有空指针异常!
java8提供了个option的封装工具

public class testOption {public static void main(String[] args) throws Exception {//作用是将对象封装成Optional对象//如果放进去的是null, 会抛出空指针异常Optional.of(null);//作用是将对象封装成Optional对象//如果放进去的是null, 会返回空的option对象 empty 还是单例的//具体为 private static final Optional<?> EMPTY = new Optional<>();Optional.ofNullable(null);//如果是null 则抛RuntimeException异常或者其子异常Optional.ofNullable(null).orElseThrow(() -> new RuntimeException());//如果是空 给予默认值Optional.ofNullable(null).orElse("默认值");Optional.ofNullable(null).ifPresent((value) -> {System.out.println("如果值不为空则" + value);});Optional.ofNullable("我是值").ifPresent((value) -> {System.out.println("如果值不为空则" + value);});//重点中的重点 连续字段取值的时候判空//如下的情况TestNull testNull1 = new TestNull();TestNull testNullA = new TestNull();testNullA.setBigDecimal(BigDecimal.TEN);testNull1.setTestNull(testNullA);if (testNull1 != null) {TestNull testNull2 = testNull1.getTestNull();if (testNull2 != null) {BigDecimal result = testNull2.getBigDecimal();if (testNull2.getBigDecimal() != null) {BigDecimal result2 = result.divide(BigDecimal.TEN);System.out.println("最终结果1:" + result);System.out.println("最终结果2:" + result2);}}}//不能说写成如下 ,如果有null则空指针异常了testNull1.getTestNull().getBigDecimal().divide(BigDecimal.TEN);BigDecimal result3 = Optional.ofNullable(testNull1).map(t1 -> t1.getTestNull()).map(t2 -> t2.getBigDecimal()).map(bigDecimal -> bigDecimal.divide(BigDecimal.TEN)).orElse(BigDecimal.ZERO);System.out.println("最终结果:" + result3);//使用flatmap 该函数的返回值必须为optionBigDecimal result4 = Optional.ofNullable(testNull1).flatMap(t1 -> Optional.of(t1.getTestNull())).flatMap(t2 -> Optional.of(t2.getBigDecimal()).flatMap(bigDecimal -> Optional.of(bigDecimal.divide(BigDecimal.TEN)))).orElse(BigDecimal.ZERO);System.out.println("最终结果:" + result3);//看起来flatmap好像是麻烦了很多 但是//如果是对象属性已经被option包起来了的话Address address = new Address(null);Person person = new Person(Optional.of(address));Optional.ofNullable(person).flatMap(Person::getAddress).flatMap(Address::getValidFrom).isPresent();//注意 属性必须为finalTestNullOp testNullOp=new TestNullOp(null,null);Optional.ofNullable(testNullOp).flatMap(TestNullOp::getTestNull).flatMap(TestNullOp::getBigDecimal).isPresent();}static class TestNull {private BigDecimal bigDecimal;private TestNull testNull;public BigDecimal getBigDecimal() {return bigDecimal;}public void setBigDecimal(BigDecimal bigDecimal) {this.bigDecimal = bigDecimal;}public TestNull getTestNull() {return testNull;}public void setTestNull(TestNull testNull) {this.testNull = testNull;}}static class TestNullOp {private final Optional<BigDecimal> bigDecimal;private  final Optional<TestNullOp> testNull;TestNullOp(Optional<BigDecimal> bigDecimal, Optional<TestNullOp> testNull) {this.bigDecimal = bigDecimal;this.testNull = testNull;}public Optional<BigDecimal> getBigDecimal() {return bigDecimal;}public Optional<TestNullOp> getTestNull() {return testNull;}}static class Person {private final Optional<Address> address;Person(Optional<Address> address) {this.address = address;}public Optional<Address> getAddress() {return address;}}static class Address {private final Optional<Instant> validFrom;Address(Optional<Instant> validFrom) {this.validFrom = validFrom;}public Optional<Instant> getValidFrom() {return validFrom;}//...}}

java8的option避免NullPoint异常相关推荐

  1. Java8多线程ForkJoinPool:处理异常

    引入Java8 lambda背后的主要动机之一是能够尽可能轻松地使用多核的能力(请参阅精通Lambdas:多核世界中的Java编程 ). 只需将代码从collection.stream()...更改为 ...

  2. 20190901 On Java8 第十五章 异常

    第十五章 异常 要想创建健壮的系统,它的每一个构件都必须是健壮的. 异常概念 C++的异常处理机制基于 Ada,Java 中的异常处理则建立在 C++的基础之上(尽管看上去更像 Object Pasc ...

  3. 类加载初始化顺序(nullpoint异常)

    package com.company.java.oop.cls; import java.util.HashMap; 类加载时,new对象会加载实例代码块 //访问使用static final一起修 ...

  4. EasyExcel 使用Converter 转换注入时报nullPoint异常

    使用EasyExcel报表导入导出时对其中的字段进行转换 @Overridepublic CellData convertToExcelData(String code, ExcelContentPr ...

  5. appium测试代码nullpoint

    今天写了个简单向上滑动,执行到向上滑动操作,报nullpoint异常,经过各种乱碰终于解决了,现记录一下过程,以备以后参考! 环境背景:java+testng+appium 在@Test下调用 dir ...

  6. Java基础类型的包装类传值NullPoint问题

    错误集,记录下自己犯过的错误 今天在做Java开发时,想一个参数类型为int的方法传递一个类型为Integer的变量, 一开始都是以有值的变量进行测试,忘了Integer的变量时引用类型,有可能为nu ...

  7. netty中的future和promise源码分析(二)

    前面一篇netty中的future和promise源码分析(一)中对future进行了重点分析,接下来讲一讲promise. promise是可写的future,从future的分析中可以发现在其中没 ...

  8. Object 转 String

    https://zhidao.baidu.com/question/646511027869477405.html?fr=iks&word=Object++%D7%AA++String& ...

  9. Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)...

    首先,在xml其中新增部分标有下划线的文件,容器初始化的时候需要扫描包 注意: a.     包款扫描(下划线部分)一定要加,默认是不扫描整个包.与每一包之间','开.如过具有同样的父包,那么我们能够 ...

最新文章

  1. 8086汇编语言精华笔记总结~
  2. ElasticSearch2.3.1环境搭建哪些不为人知的坑
  3. SpringCloud微服务实战(四)-微服务中的服务拆分
  4. 机器学习 KD树_递归_回溯_搜索(matlab实现)
  5. 安卓学习-界面-View的自定义
  6. VHDL交通灯控制器的设计
  7. 跨站请求伪造(CSRF/XSRF)
  8. Linux下send错误代码32
  9. 译文 | 与TensorFlow的第一次接触 第三章:聚类
  10. CSDN博客如何复制别人的文章到自己的博客(很详细,看着图片傻瓜式操作)
  11. 赚钱的基本逻辑就是价值交换
  12. c语言编译asn1文件,使用 asn1.c 开源编译工具生成 S1AP R15消息编解码C文件
  13. 发言倒计时器_单面会议计时器 会议发言倒计时器
  14. 锁存器芯片74HC573芯片的用法,及其在实际电路中的应用
  15. vs2019编译libcef
  16. 宏碁暗影骑士擎2022-重装系统-检测不到硬盘
  17. python电影数据分析报告_电影数据可视化项目分析报告
  18. OLYMP‘ARTS 2023奥艺大会中国推介会在北京盛大举行
  19. 耗油是什么,怎么用?
  20. 听劝!不要啥都不懂就学PMP!这100个考试关键点,带你直击考试现场

热门文章

  1. 初中计算机卡片的制作教案,卡片的制作教案..doc
  2. AUPRC Vs 平均查准率
  3. 恰当的活法――有感于《杜拉拉升职记》
  4. 中国剩余定理与孙子问题
  5. Android中的多线程编程与异步处理
  6. .net仿google analysis第三方流量监测
  7. SpringBoot:Sa-Token的具体介绍与使用
  8. anaconda安装rdkit安装指南
  9. 邮件服务器问题--邮件积压、传递延迟解决方法
  10. html5 2种布局模式