Optional

Optional构造方法私有,不能通过new创建对象。Optional创建对象的集中方法。

方法名描述
of(T value)创建一个对象,如果为空,抛出NullPointException。
ofNullable(T value)创建一个对象,可以为空。
empty()创建一个空的对象

empty()

Optional<Object> empty = Optional.empty();

返回一个空的Optional。

of(T value)

User user1 = new User("tom");
User user2 = null;
Optional<User> optional1 = Optional.of(user1);
Optional<User> optional2 = Optional.of(user2);

如果user为空的话直接抛异常NullPointException。

Exception in thread "main" java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at java.util.Optional.<init>(Optional.java:96)
    at java.util.Optional.of(Optional.java:108)
    at com.unfbx.jdk8.OptionalTest.main(OptionalTest.java:16)

ofNullable(T value)

User user1 = new User("tom");
User user2 = null;
Optional<User> optional1 = Optional.ofNullable(user1);
Optional<User> optional2 = Optional.ofNullable(user2);

可以传入null对象,不会抛NullPointException异常。

orElse(T other)和orElseGet(Supplier<? extends T> other)、orElseThrow

orElse()如果user为null,可以通过这个方法返回默认值。user为null,执行createdUser()方法获取默认值。

User user = null;
User optionalUser = Optional.ofNullable(user).orElse(createdUser());
System.out.println(optionalUser);
com.unfbx.jdk8.User@5cad8086

orElseGet也是如果user为null,可以通过这个orElseGet方法返回默认值。

orElse和orElseGet区别?

user为null的情况下没有区别。但是如果user不为null,orElse方法会继续执行后面的createdUser方法。orElseGet不会执行后续的方法。

User user = new User("tom");
Optional.ofNullable(user).orElse(createdUser());
System.out.println("-------------------------------------");
Optional.ofNullable(user).orElseGet( () -> createdUser());
createdUser do.....
-------------------------------------

isPresent()和ifPresent(Consumer<? super T> consumer)

isPresent方法是判断是否有值。

ifPresent判断是否有值,有值的话执行后续的consumer内容,没值不执行。

User user1 = new User("tom");
User user2 = null;

Optional<User> optional1 = Optional.of(user1);
Optional<User> optional2 = Optional.ofNullable(user2);

System.out.println(optional1.isPresent());
System.out.println(optional2.isPresent());

optional1.ifPresent((user) -> {
    System.out.println(user);
});
System.out.println("-------------------------------------");
optional2.ifPresent((user) -> {
    //optional2.isPresent() ==  false后续代码不执行
    System.out.println(user);
});
true
false
com.unfbx.jdk8.User@2d98a335
-------------------------------------

map()和flatMap()

参数不同map接收的Function是一个普通的Object类型数据

参数不同flatMap接收的Function是一个Optional类型的数据,方便进行链式调用。

flatMap().flatMap().map().orElse("default");

User user1 = new User("tom");

//创建Optional
Optional<User> optional2 = Optional.ofNullable(user1);

//map
String optionalS = optional2.map((u1) -> {
    return u1.getName()+" I love you";
}).orElse("default");
System.out.println(optionalS);

//flatmap
String aDefault = optional2.flatMap(u2 -> {
    Optional<String> empty = Optional.empty();
    return empty;
}).orElse("default");
System.out.println(aDefault);
文章目录