Java8 Optional 类常用方法 Java8 Optional orElse 、orElseGet 、orElseThrow 方法区别
一、概述
Optional 类,是Java8 新增加的一个对象容器。主要的功能有:对象的创建、获取、判断、过滤,映射等。
- 创建常用的方法有:empty 、of 、ofNullable
- 获取: get
- 判断: isPresent 、ifPresent 、orElse 、orElseGet 、orElseThrow
- 过滤: filter
- 映射: map 、flatMap
本文将演示各个方法的作用,并着重比较:orElse 、orElseGet 、orElseThrow 等,类似方法的区别。
二、方法用法
1、of 和 ofNullable 方法:
/**
* Description: of 和 ofNullable 方法的区别
* <br> of 不允许为null ,否则会抛出 NPE
* <br> ofNullable ,允许为 null
* @return void
* @version v1.0
* @author wu
* @date 2022/11/23 10:14
*/
@Test
public void ofNullableTest() throws Exception {
final Optional<String> s = Optional.of("111");
final Optional<String> s1 = Optional.ofNullable("222");
System.out.println(s);
System.out.println(s1);
final Optional<Object> s3 = Optional.ofNullable(null);
System.out.println(s3);
final Optional<String> s4 = Optional.of(null);
System.out.println(s4);
}
1.1、输出结果:
Optional[111]
Optional[222]
Optional.empty
java.lang.NullPointerException
....
2、orElse 、orElseGet 方法
/**
* Description: orElse 中方法调用,一定会执行; orElseGet 当前面的值为null时,才会执行
* @return void
* @version v1.0
* @author wu
* @date 2022/11/26 20:44
*/
@Test
public void orElseGetTest() throws Exception {
final String s = Optional.of("123").orElse(get("orElse"));
final String s1 = Optional.of("456").orElseGet(() -> get("orElseGet"));
System.out.println(s);
System.out.println(s1);
String str = null;
final String s2 = Optional.ofNullable(str).orElse(get("orElse22"));
final String s3 = Optional.ofNullable(str).orElseGet(()->get("orElseGet22"));
System.out.println(s2);
System.out.println(s3);
}
public String get(String s){
System.out.println(s+"===> get 方法运行 ...");
return "GET返回值";
}
2.1、输出结果:
orElse===> get 方法运行 ...
123
456
orElse22===> get 方法运行 ...
orElseGet22===> get 方法运行 ...
GET返回值
GET返回值
3. orElseThrow 方法
/**
* Description: orElseThrow : value 为null,则抛出异常
* @return void
* @version v1.0
* @author wu
* @date 2023/1/4 11:14
*/
@Test
public void orElseThrowTest() throws Exception{
final String s = Optional.ofNullable("null哈哈").orElseThrow(() -> new RuntimeException("参数为空异常"));
System.out.println("s = " + s);
final Object s2 = Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("参数为空异常123"));
System.out.println("s2 = " + s2);
}
3.1、输出结果:
s = null哈哈
java.lang.RuntimeException: 参数为空异常123
...
4、isPresent 方法:
/**
* Description: isPresent: 判断value 是否不为null, value = null, false ;
* @return void
* @version v1.0
* @author wu
* @date 2023/1/4 11:19
*/
@Test
public void isPresentTest() throws Exception{
final boolean b1 = Optional.ofNullable(null).isPresent();
System.out.println("b1 = "+ b1);
final boolean b2 = Optional.ofNullable("null 123").isPresent();
System.out.println("b2 = "+ b2);
}
4.1、输出结果:
b1 = false
b2 = true
5、ifPresent 方法:
/**
* Description: ifPresent: value != null ,则执行 Consumer 接口
* @return void
* @version v1.0
* @author wu
* @date 2023/1/4 14:28
*/
@Test
public void ifPresentTest() throws Exception{
Optional.ofNullable(null).ifPresent(System.out::println);
Optional.ofNullable("value 不为 null").ifPresent(System.out::println);
}
5.1、输出结果:
value 不为 null
6、 filter 方法:
/**
* Description: filter 方法:执行Predicate接口,满足条件返回当前对象;不满足,返回 Optional.EMPTY 常量
* @return void
* @version v1.0
* @author wu
* @date 2023/1/4 14:36
*/
@Test
public void filterTest() throws Exception{
final Optional<Object> o = Optional.ofNullable(null).filter(Objects::nonNull);
System.out.println(o);
final Optional<String> o2 = Optional.ofNullable("null 不为空").filter((val)->Objects.nonNull(val));
System.out.println(o2);
}
6.1、输出结果:
Optional.empty
Optional[null 不为空]
7、 map 和 flatMap 方法:
/**
* Description: map 和 flatMap 方法
* <br> map: 判断 value 是否为null ,value为null,则返回 Optional.EMPTY 常量 ; value不为null,则返回 Optional包装结果
* <br> flatMap 方法:value为null,返回值同 map方法; value不为null,则返回入参的Optional包装参数
* @return void
* @version v1.0
* @author wu
* @date 2023/1/4 15:45
*/
@Test
public void mapTest() throws Exception{
final User user = new User();
user.setName("小明");
final Optional<String> optional1 = Optional.of(user).map(User::getName);
System.out.println(optional1.get());
final User user2 = new User();
user2.setName("小红");
final Optional<User> op = Optional.of(user2);
final Optional<User> optional2 = Optional.of(user).flatMap((val) -> op);
System.out.println(optional2.get().getName());
final Optional<String> optiona3 = Optional.of(user2).flatMap(this::getUserName);
System.out.println(optiona3.get());
}
public Optional<String> getUserName(User user){
return Optional.ofNullable(user).map(User::getName);
}
static class User{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
7.1、输出结果:
小明
小红
小红
三、总结
1、orElse 和 orElseGet 方法区别:
- orElse 方法:无论 value 是否为null,都会执行 orElse 里的方法
- orElseGet 方法:只有 value=null 时,才会执行 orElseGet 里的方法
建议平时使用 orElseGet 方法,少用 orElse 方法!
2、map 和 flatMap 方法区别:
- map 方法: map: 判断 value 是否为null ,value为null,则返回 Optional.EMPTY 常量 ; value不为null,则返回 Optional包装结果
- flatMap 方法:value为null,返回值同 map方法; value不为null,则返回入参的Optional包装参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)