Java 10 ifPresentOrElse, которые возвращают логическое значение - PullRequest
0 голосов
/ 03 октября 2018

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

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

1 Ответ

0 голосов
/ 03 октября 2018

Работа с логическим типом возврата (легко вывести Predicate с), один из способов сделать это - использовать Optional.filter:

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

Но затем использовать *Аргументы 1008 * s кажутся плохой практикой.Как также предлагается в комментариях Карлоса, другой способ его реализации мог бы быть:

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
}
...