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()正常工作,我应该更改什么?
答案 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()));