Optional 使用场景

场景一:判断空再赋值

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);

 

你可能感兴趣的:(java,数据库,开发语言)