我有一个这样的方法:
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();