【问题标题】:How to get the sum from nested stream如何从嵌套流中获取总和
【发布时间】:2018-06-16 13:51:16
【问题描述】:

我是 Java 8 流的新手,我无法从嵌套循环运算总和中获得正确的输出。

在嵌套循环中,我调用了一个返回整数的方法;通过这样做最终总结了结果总数

这是我尝试过的:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.IntStream;

    public class NestedLoop {

        public void callTask(int i, int j) {
            System.out.println("i:"+i+"j:"+j);
        }


        public int getCount(Count count, String j) {
            if(count.getCount() >= 123 && count.getCount() <= 125) {
                System.out.println("###");
                return 1;
            }
            else {
                return 0;
            }
        }



        public static void main(String[] args) {

            List<Count> list2 = new ArrayList<>();
            List<String> list1 = new ArrayList<>();

            Count count = new Count(121);
            Count count1 = new Count(122);
            Count count2 = new Count(123);
            Count count3 = new Count(124);
            Count count4 = new Count(125);
            list2.add(count4);
            list2.add(count2);
            list2.add(count3);
            list2.add(count1);
            list2.add(count);

            NestedLoop loop = new NestedLoop();
            list1.add("list2 - Op1");
            list1.add("list2 - Op2");
            list1.add("list2 - Op2");
            list1.add("list2 - Op2");
            int _count = 0;

          IntStream res = list2.parallelStream().flatMapToInt(x -> IntStream.of(list1.stream().mapToInt(y-> loop.getCount(x,y)).sum()));
          System.out.println(res.sum());
        }
    }

Count class   
    class Count {

        private int count;

        public Count(int count) {
            super();
            this.count = count;
        }

        public int getCount() {
            return count;
        }

        public void setCount(int count) {
            this.count = count;
        }

    }

这样,我得到 12 而不是 2。

求助,代码哪里出错了。

【问题讨论】:

  • 您的用例是什么?为什么你期望 2 作为结果?
  • @Ravindra,在我的情况下,getCount 是条件基础输出;这就是我添加虚拟条件的原因
  • 答案 12 在这里是正确的。请干运行代码看看。

标签: java-8 java-stream


【解决方案1】:

请先干运行代码并查看,因为 12 是正确答案。对于list2 中的每个元素,您迭代list1,然后调用getCount,对这些值求和。对于值 123,它被调用 4 次,对于 124 和 125 相同。每个返回 1,将它们全部相加 1 * 3 * 4 得到 12。为什么需要 2?原理是什么?

这就是你想要的吗?根据您的 if 声明,这仍然产生 3。

int sum = list2.stream()
        .mapToInt(x -> list1.stream().map(y -> loop.getCount(x, y)).findAny().orElse(0))
        .sum();

但是,您现有的产生 12 的解决方案可以像这样进一步简化,

int sum = list2.stream()
    .flatMapToInt(x -> list1.stream().mapToInt(y -> loop.getCount(x, y)))
    .sum();

【讨论】:

  • 谢谢拉维,我对流一无所知。谢谢sn-p