如何过滤在流图期间引发异常的元素

时间:2018-11-15 15:25:47

标签: java collections java-8 exception-handling java-stream

我一直关注文章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,这看起来令人震惊。有没有一种更好的方法可以以一种简洁的方式跳过这些值?

1 个答案:

答案 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());
}