使用Java的Stream.reduce()来计算功率总和会产生意外结果

时间:2016-10-14 10:12:05

标签: java-8 java-stream

List<Integer> list = Arrays.asList(1, 2, 3);

int i = list.stream().mapToInt(e -> e)
            .reduce((x, y) -> (int) Math.pow(x, list.size()) + (int) Math.pow(y, list.size()))
            .getAsInt();
        System.out.println(i);

这个操作的结果应该是1 * 1 * 1 + 2 * 2 * 2 + 3 * 3 * 3 = 36.但是我得到i = 756.怎么了?为了使reduce()正常工作,我应该更改什么?

6 个答案:

答案 0 :(得分:19)

解决方案已经发布,但你得到756,

因为第一次使用(1,2)调用reduce(x,y)是

1^3+2^3=9

然后用(9,3)

减去(x,y)
9^3+3^3=756
顺便说一下,由于取幂不是关联的,你也可以得到其他值。例如,在使用并行流时,我的结果也是42876

答案 1 :(得分:17)

你甚至不需要减少

List<Integer> list = Arrays.asList(1, 2, 3);

int i = list.stream()
         .mapToInt(e -> (int) Math.pow(e, list.size()))
         .sum();

答案 2 :(得分:6)

试试这个

int i = list.stream()
            .map(e -> (int) Math.pow(e, list.size()))
            .reduce((x, y) -> x + y)
            .get();

答案 3 :(得分:3)

您也可以使用collect(Collectors.summingInt(Integer::intValue))代替reduce((x, y) -> x + y)

答案 4 :(得分:2)

发现错误,新代码如下:

List<Integer> list = Arrays.asList(1, 2, 3);

int i = list.stream().mapToInt(e -> e)
             .map(e -> (int) Math.pow(e, list.size()))
             .reduce((x, y) -> x + y)
             .getAsInt();
System.out.println(i);

答案 5 :(得分:0)

你的逻辑错了,这就是为什么你得到了756

int i = list.stream()
            .mapToInt(e -> e)
            .peek(System.out::println)
            .reduce(0,(x, y) -> x + (int) Math.pow(y, list.size()));