Optional源码解析与实践( 四 )

  • System.out.println("optional2的map前的值:"+optional2);
  • result =optional2.map(t->t.getName());
  • System.out.println("optional2的map后的值:"+result);
  • System.out.println("===========flatMap========");
  • System.out.println("optional1的flatMap前的值:"+optional1);
  • Optional<Integer> result2 =optional1.flatMap(t->Optional.ofNullable(t.getAge()));
  • System.out.println("optional1的flatMap后的值:"+result2);
  • System.out.println("optional2的flatMap前的值:"+optional2);
  • result2 =optional2.flatMap(t->Optional.ofNullable(t.getAge()));
  • System.out.println("optional2的flatMap后的值:"+result2);
  • }
  • public class User {
  • String name;
  • Integer age;
  • public User(String name,Integer age){
  • this.name = name;
  • this.age=age;
  • }
  • public String getName() {
  • return name;
  • }
  • public Integer getAge() {
  • return age;
  • 4)运行结果
    Optional源码解析与实践

    文章插图
    3 应用实例3.1 错误用法
    • 由于Optional并没有实现Serializable接口,所以不能作为类的属性 。
    • 不要把Optional作为方法的参数 。
    • 把if(x!=null)直接换成Optional.ofNullable(x).isPresent(),这样有过度编码的嫌疑 。
    • 直接使用Optional.get()的返回值进行操作,String result =Optional.ofNullable(null).get().toString();这样还是会抛出异常的 。
    3.2 建议用法A类有属性B类,B类有属性C类,C类有name这个字段 。使用Optional之前:
    1. if(atest!=null){
    2. Btest btest =atest.getBtest();
    3. if(btest!=null){
    4. Ctest ctest = btest.getCtest();
    5. if (ctest != null) {
    6. name =ctest.getName();
    7. }
    8. }
    9. }
    使用Optional之后:
    1. name = Optional.ofNullable(atest).map(t->t.getBtest()).map(t->t.getCtest()).map(t->t.getName()).orElse("默认值");
    代码是不是看上去更整洁了呢?
    4 总结通过对Optional源码解析和用例测试代码的运行结果 , 可以看出使用Optional可以优化null值判断代码,让代码变得更加优雅和整洁 。
    自猿其说Tech-JDL京东物流技术与数据智能部作者:陈昌浩

    推荐阅读