「已注销」 2020-07-10 11:30 采纳率: 25%
浏览 125
已采纳

Optional的用法疑惑,发现并没有达到的预期结果

最近在学习java的Optional,介绍中感觉Optional好强大,我根据教程写了案列,但是结果是我没有想到的。代码如下

@Data
public class PersonT {
    private Optional<CarT> car;
}

@Data
public class CarT {
    private String name;
    private Optional<InsuranceT> insurance;
}

@Data
public class InsuranceT {
    private String name;
}

public static void main(String[] args) {
        String name = Optional.of(new PersonT()).flatMap(PersonT::getCar)
                .flatMap(CarT::getInsurance)
                .map(InsuranceT::getName)
                .orElse("Unknown");
        System.out.println(name);
    }

我发现执行了这段代码后并没有达到我的预想结果,我以为会返回"Unknown",但是给我抛出了空指针异常,我想知道这是什么原因

问题补充........................
其实看了教程写着上边的这种写法可以替换我下边的这种写法

if(personT != null) {
            CarT carT = personT.getCar();
            if(carT != null) {
                InsuranceT insuranceT = carT.getInsurance();
                if(insuranceT != null) {
                    return insuranceT.getName();
                } else {
                    return "Unknown";
                }
            } else {
                return "Unknown";
            }
        } else {
            return "Unknown";
        }
  • 写回答

3条回答 默认 最新

  • 封印di恶魔 2020-07-10 15:02
    关注

    要实现你的效果应该是这样的

    class PersonT {
        private CarT car;
    
        public Optional<CarT> getCar() {
            return Optional.ofNullable(car);
        }
    
        public void setCar(CarT car) {
            this.car = car;
        }
    }
    
    class CarT {
        private String name;
        private InsuranceT insurance;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Optional<InsuranceT> getInsurance() {
            return Optional.ofNullable(insurance);
        }
    
        public void setInsurance(InsuranceT insurance) {
            this.insurance = insurance;
        }
    }
    
    class InsuranceT {
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        private String name;
    }
    public class demo {
    
        public static void main(String[] args) {
    
                String name = Optional.ofNullable(new PersonT()).flatMap(PersonT::getCar)
                        .flatMap(CarT::getInsurance)
                        .map(InsuranceT::getName)
                        .orElse("Unknown");
                System.out.println(name);
                }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器