代码里面很多判空,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. linux查看tuxedo版本的命令,Tuxedo tmadmin命令
  2. Oracle查询数据库编码
  3. 设计模式之委派模式及适配器模式
  4. 两道JVM面试题,竟让我回忆起了中学时代!
  5. 亏损63亿,美图真能“美”到上市?
  6. java中在做除法操作时,对有余数的结果进行取整
  7. Python+Requests+Pytest+YAML+Allure实现接口自动化
  8. Parse a document from a String
  9. apache2: unrecognized service
  10. paip.提升用户体验---网站导航栏的设计
  11. CAS(Compare And Swap) 详解
  12. 韩昊20190912-1 每周例行报告
  13. Hive调优之 union all 效率低的问题解决
  14. C++-线程的join和detach
  15. SAT数学公式之几何图形
  16. 阿里云ECS云服务器实例重置-更换操作系统
  17. 【无标题】scp的使用
  18. 人脸识别考勤系统安卓APP(手把手教学-手动滑稽)
  19. 北航计算机2018年保研推免经历
  20. OpenCV图像无缝融合-seamlessClone介绍与使用(附Python/C++源码)

热门文章

  1. LaTex入门【记录】
  2. 【数值优化之凸集与凸函数】
  3. TensorFlow2.0保存模型
  4. python路径规划仿真_路径规划之dijkstra
  5. C#图片加载与内存释放
  6. Linux 开机自启动
  7. CT 三维重建主要六种基本处理方法
  8. js jquery新窗口打开的几种方式
  9. JavaScript 笔记-放大镜案例
  10. 阿里巴巴-数据平台事业部-数据产品部:寻找真爱