如何返回布尔值的Java 10 ifPresentOrElse?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (871)

我对“如何正确地做到这一点”感到有点困惑:

 // return true: if present and number of lines != 0
  boolean isValid(Optional<File> optFile) {
    return optFile.ifPresentOrElse(f -> return !isZeroLine(f), return false);
 }

 private boolean isZeroLine(File f)  {
    return MyFileUtils.getNbLinesByFile(f) == 0;
 }

我知道语法不正确而且没有编译,但这只是为了让你理解。

我怎么能把它变成'干净的代码'?即避免做:

if (optFile.isPresent()) {//} else {//}
提问于
用户回答回答于

处理布尔返回类型(容易推断的Predicates),一种方法可以使用Optional.filter

boolean isValid(Optional<File> optFile) {
    return optFile.filter(this::isZeroLine).isPresent();
}

但是,那么使用Optionals参数似乎是一种糟糕的做法。正如卡洛斯的评论中所建议的那样,实现它的另一种方式可能是:

boolean isValid(File optFile) {
    return Optional.ofNullable(optFile).map(this::isZeroLine).orElse(false);
}

另一方面,ifPresentOrElse是在执行与Optional值的存在相对应的某些操作时使用的构造,例如:

optFile.ifPresentOrElse(this::doWork, this::doNothing)

相应的行动可能是 -

private void doWork(File f){
     // do some work with the file
}

private void doNothing() {
     // do some other actions
}

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励