我一直关注文章https://www.oreilly.com/ideas/handling-checked-exceptions-in-java-streams,该文章将方法提取到方法中以处理异常,并注意到给出的示例看起来很干净,因为它们实际上未编译,因为它们错过了return语句。 br /> 本质上,我希望在文章示例3中有一种类似于此“除法”的解析方法,但是我的方法会解析列表,并且在某些情况下,它将抛出错误并记录并继续,如下所示:
public List<String> validator(List<String> values) {
return values.stream()
.map(this::parse)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
public String parse(String s){
try{
// returns something or throws exceptions
} catch (Exception e ){
log(e)
}
return null;
}
从这段代码中可以看到,我通过在parse方法的末尾返回一个null欺骗了编译错误,然后我在收集之前在验证器上过滤了null,这看起来令人震惊。有没有一种更好的方法可以以一种简洁的方式跳过这些值?
答案 0 :(得分:2)
对于我来说,跳过null
元素的方式非常好。
但是,如果您想以功能性方式进行操作,则完全避免返回null
。改为返回Optional
:
public Optional<String> parse(String s){
try{
return Optional.of(<parsed_value>);
} catch (Exception e ){
log(e);
}
return Optional.empty();
}
Java 1.8 解决方案:
public List<String> validator(List<String> values) {
return values.stream()
.map(this::parse)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
Java 1.9 + 解决方案:(已由 @Holger 提出):
public List<String> validator(List<String> values) {
return values.stream()
.map(this::parse)
.flatMap(Optional::stream)
.collect(Collectors.toList());
}