【问题标题】:Java 10 ifPresentOrElse that return boolean返回布尔值的 Java 10 ifPresentOrElse
【发布时间】:2018-10-02 22:29:23
【问题描述】:

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

 // 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 {//}

【问题讨论】:

  • 类似于optFile.map(this::isZeroLine).orElse(false) ?但不确定是否有一个可选的参数是个好主意
  • @CarlosHeuberger 就是这样!
  • 阅读 Java 变得不可能了..
  • @Tyvain mapfilter 都是很好的解决方案。重新拥有Optional 参数,不要屈服于majority opinion (minority report)。 ???如果你已经有了Optional&lt;File&gt;,则无需解压即可避免Optional参数。

标签: java lambda optional java-10


【解决方案1】:

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

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

但是,然后使用Optionals 参数似乎是一种糟糕的做法。正如 Carlos 在 cmets 中所建议的那样,另一种实现方式可能是:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2022-01-10
    • 2013-08-18
    • 2018-01-24
    • 2013-03-28
    • 2017-07-31
    • 2011-12-14
    • 2020-07-29
    相关资源
    最近更新 更多