java - 如何过滤在流映射期间抛出异常的元素
问题描述
我正在关注文章https://www.oreilly.com/ideas/handling-checked-exceptions-in-java-streams将方法提取到方法中,以处理异常,并注意到给出的示例看起来很干净因为它们实际上并没有编译,因为它们错过了 return 语句。
本质上,我希望在文章示例 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,它看起来令人震惊。有没有更好的方法以干净简单的方式跳过这些值?
解决方案
至于我,你跳过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());
}
推荐阅读
- c - 如何在c中的函数中传递不同数量的参数
- r - 来自R中的合并回归的稳健聚集标准误差?
- coq - 在 Coq 中实现 Boruvka 算法
- python - Python 和模块化算术
- amazon-web-services - 亚马逊 S3 上传对象 LastModified 日期保持更改?
- django-rest-framework - 数据未传递到 DRF 中的嵌套序列化程序
- math - 找出没有两个相同元素彼此相邻的排列数
- ios - React Native:Appcircle CI 中的 iOS 存档构建失败
- spring-boot - 如何使用 spring-data-aerospike 进行设置
- python - 无法使用 Django 创建新用户