欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Optional

程序员文章站 2022-03-04 11:35:41
...

转为Optinal对象 car为null也行
Optional<Car> optionalCar=Optional.ofNullable(car);

//人不一定有车
public class Person {

    private Optional<Car> car;

    public Optional<Car> getCar() {
        return car;
    }
}
//车没保险也正常
public class Car {

    private Optional<Insurance> insurance;

    public Optional<Insurance> getInsurance() {

        return insurance;
    }
}
//保险一定有名字!
public class Insurance {

    private String name;

    public String getName() {
        return name;
    }
}

层层get可能为空 拿到最里面的值

 public String getCarInsuranceName(Optional<Person> optionalPerson) {

//不能用map 会包2层Optional,因为getCar返回Optional<Car>
      //  Optional<Optional<Car>> car = optionalPerson.map(Person::getCar);
        
        return optionalPerson
                     .flatMap(Person::getCar)
                     .flatMap(Car::getInsurance)
                     .map(Insurance::getName)
                     .orElse("Unknown");//没有值时的默认值
    }

2个Optional都不null才执行xxx

Optional<Insurance> findCheapestInsurance(Optional<Person> optionalPerson,Optional<Car> optionalCar){
        
        return optionalPerson
                //如果是null不会调用
                .flatMap(p->optionalCar
                        //如果是null不会调用
                        .map(c->xxx(p,c))
                );
    }

    //2个都不是null才会执行到这
    private Insurance xxx(Person p, Car c) {
        //todo;
    }

如果不是null,并且满足条件,才执行....

Optional<Insurance> optInsurance = Optional.ofNullable(new Insurance());
        optInsurance
                 //存在并且满足条件,才会返回原值 不能后面就是null
                .filter(insurance -> "某名字".equals(insurance.getName()))
                .ifPresent(insurance->System.out.println("就是"));

string 转 Optional<Integer>

  public static  Optional<Integer> string2Integer(String str){
        try {
            return Optional.of(Integer.parseInt(str));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }