修改并行流java中的本地列表



我有一个这样的方法:

public void method ()
{
List<String> list1 = someOperation();
List<List2Class> list2;
long failedCount = 0;
for (String element : list1) {
try {
list2 = someclass.method1(element);
list2 = someclass.method2(element);
someclass.saveToDB(list2);

} catch (Exception e) {
failedCount++;

}
}
//some checks on failedCount
}

我想把for循环转换成并行流,有人能告诉我上面方法的代码变化应该是什么吗?PS - method1和method2返回的是修改后的list2。

这里的逻辑基本上是"最后一次成功操作的结果"。

假设您不需要failedCount(您没有显示它正在使用),您可以这样做:将成功的操作映射到当前的Optional,将失败的操作映射到不存在的Optional;最后一个现在时是可选的:

Optional<List<List2Class>> opt = list1.stream()
.flatMap(element -> Stream.of(runOperation(someclass::method1, element), runOperation(someclass::method2, element))
.reduce((a, b) -> !b.isPresent() ? a : b);

其中runOperation类似于:

Optional<List<List2Class>> runOperation(Function<String, List<List2Class>> operation, String parameter) {
try {
return Optional.of(operation.apply(parameter));
} catch (Exception e) {
return Optional.absent();
}
}

如果没有操作成功,你需要决定list2的值应该是多少。

如果你确实需要failedCount,你可以把它分开一点:

Stream<Optional<List<List2Class>>> intermediate =
list1.stream()
.flatMap(element -> Stream.of(runOperation(someclass::method1, element), runOperation(someclass::method2, element));
Map<Boolean, List<Optional<List<List2Class>>>> partitioned =
intermediate.collect(Collectors.partitioningBy(Optional::isPresent));

现在partitioned.get(true)拥有所有成功的结果,而partitioned.get(false)拥有所有失败的结果。所以:

Optional<List<List2Class>> opt = partitioned.get(true).stream().reduce((a, b) -> !b.isPresent() ? a : b);
long failedCount = partitioned.get(false).size();

相关内容

  • 没有找到相关文章

最新更新