Java 8示例if if else with Optional

时间:2017-11-14 14:09:26

标签: java

我有一个返回Optional的方法。基本上,它从DB获取值,如果存在DB的值,并且如果值在20年之前,则返回currentDate-20 years,否则返回原样。

Optional<Instant> getJoinDate(final Instant instant) {

        final Optional<Employee> joinTime = empService.retrieveById(1);

        if (joinTime.isPresent()) {

            final Instant joinDate = joinTime.get().getJoinTime().toInstant();

            if (joinDate.isBefore(instant.minus(20,ChronoUnit.YEARS))) {
                return Optional.of(instant.minus(20, ChronoUnit.YEARS));
            }
            else {
                return Optional.of(joinDate);
            }
        }

        return Optional.empty();
    }

有没有简单的方法可以使用Java 8而不用其他方法呢?

由于

2 个答案:

答案 0 :(得分:3)

您可以使用flatMap

Optional<Instant> getJoinDate(final Instant instant) {
    final Optional<Employee> joinTime = empService.retrieveById(1);
    return joinTime.flatMap (emp -> {
        final Instant joinDate = emp.getJoinTime().toInstant();
        if (joinDate.isBefore(instant.minus(20,ChronoUnit.YEARS))) {
            return Optional.of(instant.minus(20, ChronoUnit.YEARS));
        }
        else {
            return Optional.of(joinDate);
        }
    });
}

当然你可以用三元条件表达式替换内部if-else:

Optional<Instant> getJoinDate(final Instant instant) {
    final Optional<Employee> joinTime = empService.retrieveById(1);
    return joinTime.flatMap (emp -> {
        final Instant joinDate = emp.getJoinTime().toInstant();
        return joinDate.isBefore(instant.minus(20,ChronoUnit.YEARS)) ?
            Optional.of(instant.minus(20, ChronoUnit.YEARS)) :
            Optional.of(joinDate);
    });
}

甚至更短:

Optional<Instant> getJoinDate(final Instant instant) {
    return empService.retrieveById(1).flatMap (emp -> 
            emp.getJoinTime().toInstant().isBefore(instant.minus(20,ChronoUnit.YEARS)) ?
            Optional.of(instant.minus(20, ChronoUnit.YEARS)) :
            Optional.of(emp.getJoinTime().toInstant()));
}

但是,这有两次调用emp.getJoinTime().toInstant()的缺点。

答案 1 :(得分:1)

如果我正确理解您的代码,就是这样:

Optional<Instant> getJoinDate(Instant instant) {
    Instant cap = instant.minus(20,ChronoUnit.YEARS)
    return empService.retrieveById(1)
        .map(employee -> employee.getJoinTime().getInstant())
        .map(joinInstant -> joinInstant.before(cap)?cap:joinInstant);
}