【发布时间】:2019-07-06 04:05:51
【问题描述】:
我在 Java 中使用 Optional 和 lambdas 编写代码,想知道在以下情况下最好的方法是什么:
public Optional<BObject> readIndexMaybe(String ref) {
try {
return Optional.ofNullable(index.read(ref)).map(BObjectBuilder::build);
} catch (IOException e) {
LOGGER.error(String.format("Could not read index of ref: %s, error: %s", ref, e));
}
return Optional.empty();
}
public Optional<BObject> readMaybe(String ref) {
Optional<BObject> bObject = readIndexMaybe(ref);
return bObject.flatMap(boMaybe -> { <---- HERE
try {
LOGGER.debug(String.format("Object read: %s", ref));
BObject obj = new BObjectBuilder(boMaybe).stream(loadDocumentStream(boMaybe)).build();
return Optional.of(obj);
} catch (IOException e) {
LOGGER.error(String.format("Could not read file with ref: %s, error: %s", ref, e));
}
return Optional.empty();
});
}
使用返回 Optional<BObject> 的 lambda 函数然后在其上使用 flatMap 以接收 Optional<BObject> 作为返回类型更好,还是在 lambda 中返回 null 然后更好只需使用map:
public Optional<BObject> readIndexMaybe(String ref) {
try {
return Optional.ofNullable(index.read(ref)).map(BObjectBuilder::build);
} catch (IOException e) {
LOGGER.error(String.format("Could not read index of ref: %s, error: %s", ref, e));
}
return Optional.empty();
}
public Optional<BObject> readMaybe(String ref) {
Optional<BObject> bObject = readIndexMaybe(ref);
return bObject.map(boMaybe -> { <--- HERE
try {
LOGGER.debug(String.format("Object read: %s", ref));
return new BObjectBuilder(boMaybe).stream(loadDocumentStream(boMaybe)).build();
} catch (IOException e) {
LOGGER.error(String.format("Could not read file with ref: %s, error: %s", ref, e));
}
return null;
});
}
第一种方法对我来说似乎稍微好一些,因为我可能会在其他地方重用 lambda 函数,它不会返回 null,而是返回 Optional。但是,只要我只在一个地方使用它就值得吗?
【问题讨论】:
-
我认为这有点基于意见(即离题)。我更喜欢前者,因为我尽量避免使用
null关键字,除非我必须这样做。但是后者更简洁。 -
我建议不要在这种情况下使用 optional ,因为它只会使一切复杂化。
-
您可以重新抛出包裹在
UncheckedIOException中的异常,然后在 lambda 之外捕获它并返回一个空的可选项。
标签: java java-8 functional-programming optional