我有一个返回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而不用其他方法呢?
由于
答案 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);
}