如何从嵌套流中获取总和

时间:2018-06-16 13:51:16

标签: java-8 java-stream

我是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。

帮助,我代码有问题。

1 个答案:

答案 0 :(得分: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();