什么是Optional
?
Optional
是java8中引入的一个包含或者不包含一个非空对象的容器对象
Optional
有哪些方法?
方法 | 返回值 | 说明 |
---|---|---|
of(T) |
Optional<T> |
创建一个Optional 对象,如果是空,则抛出NullPointerException() |
ofNullable(T) |
Optional<T> |
创建一个Opthonal 对象,如果是空,则返回空Optional |
get() |
T |
获取Optional 中的值,如果是空则抛出NoSuchElementException |
isPresent() |
boolean |
判断对象是否是空 |
ifPresent(Consumer<? super T>) |
void |
如果存在则执行Consumer |
map(Function<? super T, ? extends U>) |
Optional<U> |
将一个值映射到另外一个值 |
flatMap(Function<? super T, Optional<U>>) |
Optional<U> |
将一个值映射到另外一个值 |
orElse(T) |
T |
当数据不存在时返回T |
orElseGet(Supplier<? extends T>) |
T |
当数据不存在时获取supplier中的值 |
orElseThrow(Supplier<? extends X>) |
T |
当数据不存在的时候抛出异常 |
filter(Predicate<? super T>) |
Optional<T> |
Optional 中的值如果存在,则执行过滤逻辑,如果断言返回的值是true则,返回包含该值得Optional 对象,否则返回包含空值的Optional 对象 |
of(T)
与ofNullable(T)
方法
两者区别,ofNullable
可以传null
,of
方法不能传null
- 使用of方法传
null
@Test
public void testOptionalNull() {
Optional<Object> objectOptional = Optional.of(null);
}
当使用of方法包装空对象时会抛出NullPointException
get()
方法
- 使用
Optional
包装非空对象,调用get方法
private User user;
@BeforeEach
public void createUser() {
user = User.builder().id(1L)
.name("user1")
.build();
}
@Test
public void testOptionalOf() {
Optional<User> userOptional = Optional.of(this.user);
User user = userOptional.get();
System.out.println("get:" + user);
}
执行结果:
- 使用
Optional
包装空对象,调用get方法
@Test
public void testOptional() {
Optional<User> emptyObj = Optional.empty();
User user = emptyObj.get();
System.out.println(user);
}
执行结果,会抛出NoSuchElementException
isPresent()
方法
private User user;
@BeforeEach
public void createUser() {
user = User.builder().id(1L)
.name("user1")
.build();
}
@Test
public void testOptionalIsPresent() {
Optional<User> userOptional = Optional.ofNullable(this.user);
System.out.println("user isPresent:" + userOptional.isPresent());
System.out.println("=============");
Optional<Object> emptyOptional = Optional.ofNullable(null);
System.out.println("Empty isPresent:" + emptyOptional.isPresent());
}
执行结果:
ifPresent(Consumer<? super T>)
方法
private User user;
@BeforeEach
public void createUser() {
user = User.builder().id(1L)
.name("user1")
.build();
}
@Test
public void testOptionalIfPresent() {
Optional<User> userOptional = Optional.ofNullable(this.user);
userOptional.ifPresent(user -> System.out.println("Optional value存在:" + user));
System.out.println("=============");
Optional<Object> emptyOptional = Optional.ofNullable(null);
emptyOptional.ifPresent(obj -> System.out.println("Optional value存在:" + obj));
}
执行结果:
map(Function<? super T, ? extends U>)
方法
private User user;
@BeforeEach
public void createUser() {
user = User.builder().id(1L)
.name("user1")
.build();
}
@Test
public void testOptionalMap() {
String name = Optional.of(user).map(User::getName).get();
log.info("name:{}", name);
}
执行的结果:
orElse(T)
与 orElseGet(Supplier<? extends T>)
的区别
private User user;
@BeforeEach
public void createUser() {
user = User.builder().id(1L)
.name("user1")
.build();
}
@Test
public void testOptionalOrElse() {
User user = Optional.of(this.user).orElse(this.createNewUser(10L));
System.out.println("or else user:" + user);
User user1 = Optional.of(this.user).orElseGet(() -> this.createNewUser(10L));
System.out.println("or else get user:" + user1);
System.out.println("===================");
User user2 = Optional.<User>empty().orElse(this.createNewUser(10L));
System.out.println("empty or else user:" + user2);
User user3 = Optional.<User>empty().orElseGet(() -> this.createNewUser(10L));
System.out.println("empty or else get user:" + user3);
}
private User createNewUser(Long id) {
System.out.println("Create new user!");
return User.builder()
.id(id)
.name("user" + id)
.build();
}
执行结果:
当
Optional
包含的对象都是空时,orElse
与orElseGet
方法都会返回参数中获取到的对象,区别是当Optional
包含的对象不为空时,orElseGet
中createNewUser
是懒加载
的
orElseThrow(Supplier<? extends X>)
方法
@Test
public void testOptionalOrElseThrow() {
User user = null;
Object o = Optional.ofNullable(user).orElseThrow(IllegalArgumentException::new);
}
执行的结果:
filter(Predicate<? super T>)
方法
@Test
public void testOptionalFilter() {
Optional<User> userOptional = Optional.of(this.user);
Optional<User> filterOptional = userOptional.filter(user -> user.getName() != null && user.getName().contains("1"));
User user = filterOptional.get();
System.out.println("filter存在的结果:" + user);
System.out.println("==============");
Optional<User> emptyOptional = Optional.empty();
Optional<User> filterEmptyOptional = emptyOptional.filter(emptyUser -> emptyUser.getName() != null && emptyUser.getName().contains("1"));
User emptyUser = filterEmptyOptional.get();
System.out.println("empty filter存在的结果:" + emptyUser);
}
执行结果: