繁体   English   中英

如何在 java stream 中应用过滤器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM