Java8中的Optional
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);
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。