[英]How to apply filter in sum function in java stream
我正在尝试在总和 function 中应用过滤器。
Integer lyf = events.stream().mapToInteger(i -> i).filter(sum()>100?100:sum());
但我面临一个错误。
你需要先计算总和,
int sum = events.stream().mapToInt(i -> i).sum();
lyf = sum>100 ? 100 : sum;
更新:如果您想在达到部分总和 > 100 后短路 Stream 管道,您可以使用如下过滤器,
AtomicInteger sum = new AtomicInteger(0);
events.stream()
.mapToInt(sum::addAndGet)
.filter(i -> sum.get() > 100)
.mapToObj(i1 -> {
if (sum.get() < 100)
return sum.get();
else
sum.set(100);
return sum;
})
.findAny();
System.out.println(sum.get());
您将需要使用 Stream short-circuiting
功能之一。 在这种情况下,我将使用allMatch()
function。
这是我写的一个小测试来验证
@Test
public void testShortCircuitingSum() {
final AtomicInteger totalSum = new AtomicInteger(0);
IntStream.range(0, 1000).allMatch(value -> totalSumLessThan100(totalSum, value));
System.out.println("Final sum is " + totalSum.get());
}
private static boolean totalSumLessThan100(AtomicInteger totalSum, int value) {
if (totalSum.addAndGet(value) <= 100) {
return true;
}
System.out.println("Total sum is " + totalSum.get() + ". Short-Circuiting at value " + value);
System.out.println("Setting the value to 100");
totalSum.set(100);
return false;
}
哪个打印
Total sum is 105. Short-Circuiting at value 14
Setting the value to 100
Final sum is 100
您还可以使用reduce
过滤和添加蒸汽:
Integer lyf = events.stream().reduce(0, (acc, v) -> acc > 100 ? 100 : (acc + v));
达到 sum > 100 时short circuit
停止的其他方法:
AtomicInteger acc = new AtomicInteger(0);
events.stream()
.allMatch(x ->
acc.updateAndGet((a) -> Math.min(100, (a + x) )) < 100
);
Integer lyf = acc.get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.