java8优雅判空及orElse和orElseGet的区别
总结
当ofNullable传入的对象为null时,orElse也会执行里面的方法,orElseGet也会执行。
当ofNullable传入对象不为null时,orElse会执行,但是orElseGet不会执行。
实例
/**
* orElse、orElseGet使用区别
*/
@Test
public void TestOrElse() {
// orElse举例
UserOptional user = new UserOptional();
user.setName(null);
user.setSex("男");
String message = Optional.ofNullable(user.getName()).orElse(printData("ofNullable为空, orElse"));
UserOptional user1 = new UserOptional();
user1.setName("小马");
user1.setSex("男");
String message1 = Optional.ofNullable(user1.getName()).orElse(printData("ofNullable不为空, orElse"));
// orElseGet举例
UserOptional user2 = new UserOptional();
user2.setName(null);
user2.setSex("男");
String message2 = Optional.ofNullable(user2.getName()).orElseGet(() -> printData("ofNullable为空, orElseGet"));
UserOptional user3 = new UserOptional();
user3.setName("小马");
user3.setSex("男");
String message3 = Optional.ofNullable(user3.getName()).orElseGet(() -> printData("ofNullable不为空, orElseGet"));
System.out.println("========================================");
System.out.println(message);
System.out.println(message1);
System.out.println(message2);
System.out.println(message3);
}
/**
* 打印信息
* @param message
* @return
*/
public static String printData (String message) {
message = message.concat("被执行了");
System.out.println(message);
return message;
}
输出结果:
ofNullable为空, orElse被执行了
ofNullable不为空, orElse被执行了
ofNullable为空, orElseGet被执行了
========================================
ofNullable为空, orElse被执行了
小马
ofNullable为空, orElseGet被执行了
小马
程序结果分析:
可以看到:当ofNullable传入对象不为空,orElse也会执行!!!
使用的情景
当值是函数或者需要计算时建议使用orElseGet,当值是基础类型值时就用orElse
使用orElse的情形:数值,字符串,引用
orElse(0)
orElse(“unKnown”);
orElse(ref);
使用orElseGet的情形:集合引用,性能会更好。
orElseGet(Collections.emptyMap);
orElseGet(Collections.emptyList);
orElseGet(RandomUtils::nextInt)