目录
前言
Optional的构造方法
Optional的相关方法介绍
isPresent用法:
get用法:
filter用法:
orElse用法:
orElseGet用法
orElseThrow用法
map用法
flatMap用法:
前言
Optional 类是java8的新特性,是一个可以为null的容器对象。它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测,很好的解决空指针异常。
Optional的构造方法
1.为value创建一个Optional对象,如果value为空则会报出NullPointerException异常
Optional.of(T value)
2.为value创建一个Optional对象,但允许value为null值。如果传入的值为 null 的话,返回的就是Optional.empty()
Optional.ofNullable(T value)
3.该方法用来构造一个空的 Optional,即该 Optional 中不包含值,其实底层实现还是 如果 Optional 中的 value 为 null 则该 Optional 为不包含值的状态,然后在 API 层面将 Optional 表现的不能包含 null 值,使得 Optional 只存在 包含值 和 不包含值 两种状态。
Optional.empty()
Optional的相关方法介绍
isPresent用法:
1)判断当前value是否为null,如果不为null则返回true,否则false。
2)如果不为null值就执行函数式接口的内容
用法示例:
@Test
public void TestOptional(){
UserDto userDto = new UserDto();
userDto.setName("high");
Optional<UserDto> user = Optional.ofNullable(userDto);
user.ifPresent(n-> System.out.println("userdto name is "+ n.getName()));
}
get用法:
返回当前的值,如果为空则报异常。
filter用法:
filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
用法示例:
@Test
public void TestOptional(){
UserDto userDto = new UserDto();
userDto.setId(1L).setName("high1").setAge(18);
Optional<String> name = Optional.ofNullable(userDto)
.filter(user -> user.getAge() > 19)
.map(user -> user.getName());
System.out.println("name is"+name.orElse("空值"));
}
orElse用法:
如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数。
示例:
@Test
public void TestOptional(){
UserDto userDto = null;
UserDto userDto1 = Optional.ofNullable(userDto)
.orElse(new UserDto().setId(1L).setName("high").setAge(18));
System.out.println(userDto1);
}
orElseGet用法
orElseGet和orElse类似,只是orElseGet支持函数式接口来生成other值。
用法示例:
@Test
public void TestOptional(){
UserDto userDto = null;
UserDto userDto1 = Optional.ofNullable(userDto)
.orElseGet(()->new UserDto().setId(1L).setName("high").setAge(18));
System.out.println(userDto1);
}
orElseThrow用法
如果有值则返回,没有则用函数式接口抛出生成的异常。
用法示例:
@Test
public void TestOptional(){
UserDto userDto = null;
UserDto userDto1 = Optional.ofNullable(userDto)
.orElseThrow(()->new RuntimeException("没有该用户"));
System.out.println(userDto1);
}
map用法
如果当前 Optional 为 Optional.empty,则依旧返回 Optional.empty;否则返回一个新的 Optional,该 Optional 包含的是:函数 mapper 在以 value 作为输入时的输出值。
用法示例:
@Test
public void TestOptional(){
UserDto userDto = new UserDto();
userDto.setId(1L).setName("high1").setAge(18);
Optional<String> name = Optional.ofNullable(userDto)
.map(user->user.setName(" high1.1"))
.map(UserDto::getName)
.map(String::toUpperCase);
System.out.println("name is"+name.orElse("空值"));
}
flatMap用法:
与map用法差不多,区别在于 flatMap 要求参数中的函数 mapper 输出的就是 Optional。
用法:
@Test
public void TestOptional(){
UserDto userDto = new UserDto();
userDto.setId(1L).setName("high1").setAge(18);
Optional<String> name = Optional.ofNullable(userDto)
.flatMap(user->Optional.of(user.setName(" high1.1")))
.flatMap(user->Optional.of(user.getName()))
.flatMap(user->Optional.of(user.toUpperCase()));
System.out.println("name is"+name.orElse("空值"));
}