Java 10 ifPresentOrElse, возвращающий логическое значение

Я немного запутался в том, "как это сделать правильно":

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

person Tyvain    schedule 02.10.2018    source источник
comment
типа optFile.map(this::isZeroLine).orElse(false) ? но не уверен, что наличие необязательных аргументов в качестве аргумента является хорошей идеей   -  person user85421    schedule 03.10.2018
comment
@CarlosHeuberger Вот и все!   -  person Tyvain    schedule 03.10.2018
comment
Читать Java становится невозможно.   -  person Koray Tugay    schedule 03.10.2018
comment
@Tyvain Оба map и filter являются хорошими решениями. Имея параметр Optional, не поддавайтесь мнению большинства (отчет меньшинства). ???? Если у вас уже есть Optional<File>, то распаковывать его не нужно, чтобы избежать параметра Optional.   -  person Nicolai Parlog    schedule 03.10.2018


Ответы (1)


Имея дело с логическим типом возврата (легко выводимым 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
}
person Naman    schedule 03.10.2018