Java 10 ifPresentOrElse 即 return 布尔值
Java 10 ifPresentOrElse that return boolean
我对"how to do this properly"有点困惑:
// 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;
}
我知道语法不正确,无法编译,但这只是为了让你明白。
我怎样才能把它变成 'clean code'?
即避免做:
if (optFile.isPresent()) {//} else {//}
处理布尔 return 类型(很容易推断出 Predicate
s),一种方法是使用 Optional.filter
:
boolean isValid(Optional<File> optFile) {
return optFile.filter(this::isZeroLine).isPresent();
}
但是,使用 Optional
的参数似乎是一种糟糕的做法。正如卡洛斯在评论中所建议的那样,另一种实施方式可能是:
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
}
我对"how to do this properly"有点困惑:
// 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;
}
我知道语法不正确,无法编译,但这只是为了让你明白。
我怎样才能把它变成 'clean code'? 即避免做:
if (optFile.isPresent()) {//} else {//}
处理布尔 return 类型(很容易推断出 Predicate
s),一种方法是使用 Optional.filter
:
boolean isValid(Optional<File> optFile) {
return optFile.filter(this::isZeroLine).isPresent();
}
但是,使用 Optional
的参数似乎是一种糟糕的做法。正如卡洛斯在评论中所建议的那样,另一种实施方式可能是:
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
}