场景一:判断空再赋值
User user = userDao.getUser(id);
if (user!= null) {
user.setName("张三");
}
// 使用Optional 和函数式编程,一行搞定,而且像说话一样
Optional.ofNullable(user).ifPresent(p -> user.setName("李四"));
场景二:空值判断抛异常
public void test1() throws Exception {
Student student = new Student(null, 3);
if (student == null || isEmpty(student.getName())) {
throw new Exception();
}
String name = student.getName();
// 业务省略...
// 使用Optional改造
Optional.ofNullable(student).filter(s -> !isEmpty(s.getName())).orElseThrow(() -> new Exception());
}
public static boolean isEmpty(CharSequence str) {
return str == null || str.length() == 0;
}
3、场景三:多值判断抛异常
public static String getChampionName(Competition comp) throws IllegalArgumentException {
if (comp != null) {
CompResult result = comp.getResult();
if (result != null) {
User champion = result.getChampion();
if (champion != null) {
return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}
public static String getChampionName(Competition comp) throws IllegalArgumentException {
return Optional.ofNullable(comp)
.map(Competition::getResult) // 相当于c -> c.getResult(),下同
.map(CompResult::getChampion)
.map(User::getName)
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}
4、场景四:类型之间的转换,并且当没有值的时候返回一个默认值
int timeout = Optional.ofNullable(RedisProperties.getTimeout())
.map(x -> Long.valueOf(x.toMillis()).intValue())
.orElse(10000);