如何过滤流映射期间抛出异常的元素
how to filter elements that throw exception during stream map
我正在关注将方法提取到方法中的文章 https://www.oreilly.com/ideas/handling-checked-exceptions-in-java-streams,以便处理异常,并注意到给出的示例看起来很干净,因为它们实际上没有编译,因为它们错过了 return声明。
本质上,我希望有一个类似于文章示例 3 中的 "divide" 的解析方法,但我的解析了列表,在某些情况下它会抛出错误记录并继续,如下所示:
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;
}
正如您从这段代码中看到的那样,我通过在解析方法的末尾 return 设置一个空值来避免编译错误,然后在收集之前在我的验证器上过滤空值,这看起来令人震惊。有没有更好的方法以干净简单的方式跳过这些值?
至于我,您跳过 null
元素的方式非常好。
但是,如果您想以功能方式执行此操作,则完全避免返回 null
。 Return 改为 Optional
:
public Optional<String> parse(String s){
try{
return Optional.of(<parsed_value>);
} catch (Exception e ){
log(e);
}
return Optional.empty();
}
Java1.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());
}
我正在关注将方法提取到方法中的文章 https://www.oreilly.com/ideas/handling-checked-exceptions-in-java-streams,以便处理异常,并注意到给出的示例看起来很干净,因为它们实际上没有编译,因为它们错过了 return声明。
本质上,我希望有一个类似于文章示例 3 中的 "divide" 的解析方法,但我的解析了列表,在某些情况下它会抛出错误记录并继续,如下所示:
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;
}
正如您从这段代码中看到的那样,我通过在解析方法的末尾 return 设置一个空值来避免编译错误,然后在收集之前在我的验证器上过滤空值,这看起来令人震惊。有没有更好的方法以干净简单的方式跳过这些值?
至于我,您跳过 null
元素的方式非常好。
但是,如果您想以功能方式执行此操作,则完全避免返回 null
。 Return 改为 Optional
:
public Optional<String> parse(String s){
try{
return Optional.of(<parsed_value>);
} catch (Exception e ){
log(e);
}
return Optional.empty();
}
Java1.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());
}