美文网首页
java Optional

java Optional

作者: 鸡熟了 | 来源:发表于2020-02-26 16:10 被阅读0次

常见用法

null对象处理

@Data
@AllArgsConstructor
public class Sneakers {
    private String name;
    private Integer size;
    private Brand brand;
}
@Data
@AllArgsConstructor
public class Brand {
    private String name;
    private String location;
    private Person ceo;
}
@Data
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    private String sex;
}
// 不使用Optional
Sneakers aj1 = new Sneakers("air jordan 1 black", 44, null);
if (aj1 != null && aj1.getBrand() != null && aj1.getBrand().getCeo() != null) {
    System.out.println("real ceo:" + aj1.getBrand().getCeo().getName());
} else {
    System.out.println("default ceo:xxxxx");
}
// console:
// default ceo:xxxxx

// 使用Optional
System.out.println("ceo:" + Optional.of(aj1).map(Sneakers::getBrand).map(Brand::getCeo).orElse(new Person("qiaodan", 44, "male")).getName());
// console:
// ceo:qiaodan
@Data
@AllArgsConstructor
public class Cat {
    private String name;
    private String type;
    private int age;
}
List<Cat> cats = Lists.newArrayList(
        new Cat("咪咪", "中华田园", 10)
        , new Cat("喵喵", "波斯猫", 5)
        , new Cat("阿花", "暹罗猫", 3));

System.out.println(cats.stream().findFirst().orElse(new Cat("默认", "未知", 2)).getName());
cats.remove(0);
System.out.println(cats.stream().findFirst().orElse(new Cat("默认", "未知", 2)).getName());
cats.clear();
System.out.println(cats.stream().findFirst().orElse(new Cat("默认", "未知", 2)).getName());

// console:
// 咪咪
// 喵喵
// 默认

一些坑

orElse方法不管Optional对象本身是不是emptyorElse里的代码都会被执行

@Data
public class Cat {
    private String name;
    private String type;
    private int age;

    public Cat(String name, String type, int age) {
        this.name = name;
        this.type = type;
        this.age = age;
        System.out.println(String.format("a new cat:%s", name));
    }
}

Optional的实体是null的时候,一切正常

Cat c1 = null;
System.out.println(Optional.ofNullable(c1).orElse(new Cat("咪咪1", "中华田园", 10)).getName());
System.out.println(Optional.ofNullable(c1).orElseGet(() -> new Cat("咪咪2", "中华田园", 10)).getName());
// console:
// a new cat:咪咪1
// 咪咪1
// a new cat:咪咪2
// 咪咪2

Optional的实体非null的时候,问题就来了

Cat c1 = new Cat("喵喵", "波斯猫", 5);
System.out.println(Optional.ofNullable(c1).orElse(new Cat("咪咪1", "中华田园", 10)).getName());
System.out.println(Optional.ofNullable(c1).orElseGet(() -> new Cat("咪咪2", "中华田园", 10)).getName());
// console:
// a new cat:喵喵
// a new cat:咪咪1
// 喵喵
// 喵喵

相关文章

网友评论

      本文标题:java Optional

      本文链接:https://www.haomeiwen.com/subject/xxyxchtx.html