我尝试在java中处理流的reduce(item,aggregator)
函数中的异常。这是我的原始代码:
List<ReportRow> totalList = newList.stream()
.collect(Collectors.groupingBy(a -> a.getEngagementCode()))
.entrySet().stream()
.map(engagement -> engagement.getValue().stream()
.reduce((item, aggregator) ->
new ReportRow(item.getEnvironment(), item.getApplicationName(), item.getEngagementCode(), item.getTotalHits() + aggregator.getTotalHits(), item.getServiceLine(), Float.toString(Float.parseFloat(item.getTotalCost().replace(",", "")) + Float.parseFloat(aggregator.getTotalCost().replace(",", ""))), item.getPrimaryOwnerEmail(), item.getDeploymentId()))
.get())
.collect(Collectors.toList());
这大概就是我所期望的样子(虽然不起作用)。
List<ReportRow> totalList = newList.stream()
.collect(Collectors.groupingBy(a -> a.getEngagementCode()))
.entrySet().stream()
.map(engagement -> engagement.getValue().stream()
.reduce((item, aggregator) -> {
try {
new ReportRow(item.getEnvironment(), item.getApplicationName(), item.getEngagementCode(), item.getTotalHits() + aggregator.getTotalHits(), item.getServiceLine(), Float.toString(Float.parseFloat(item.getTotalCost().replace(",", "")) + Float.parseFloat(aggregator.getTotalCost().replace(",", ""))), item.getPrimaryOwnerEmail(), item.getDeploymentId()))
} catch (Exception e) {
throw new ImproperDataException("No Deployment Id present in row: "+ item.toString());
}
}
.get())
.collect(Collectors.toList());
当我试图调用ReportRow()
构造函数时,会发生异常。如何处理此异常,同时仍像原始方法中那样使用collect,stream和map?
1条答案
按热度按时间8cdiaqws1#
如果发生未检查的异常,它将终止流处理。这在无法恢复的意外问题的情况下很有用。要做到这一点,ImproperDataException应该扩展RuntimeException。出于可读性原因,我将在方法中移动try-catch和throw逻辑。
对于检查的异常,您应该决定需要发生什么。要么继续该过程(通过跳过该项或使用默认值),要么通过将其 Package 在未检查的异常中来终止。您不能从流表达式传播检查的异常。
下面是一个简化的稍微人为的例子。当发生ArithmeticException时,报告中会跳过costPerHit计算。
输出:
实际上,由于我使用单个ReportRow作为各种可变容器,因此使用
collect
而不是reduce
可能更好:我认为这也可能对您的实际代码更好