我想对整数列表进行求和。以下是代码示例,但语法不太对。这段代码能否进行优化?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
我想对整数列表进行求和。以下是代码示例,但语法不太对。这段代码能否进行优化?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
很遗憾,似乎Stream API只能从普通流中返回,例如List<Integer>#stream()
。 猜测他们必须这样做是因为泛型的工作方式。
这些普通的Streams是泛型对象,因此没有像sum()
等专门的方法,因此您必须默认使用奇怪的重新流“看起来像无操作”的转换才能获得这些方法…….mapToInt(i -> i)
。
另一个选择是使用“Eclipse Collections”,它们类似于扩展的Java Stream API
IntLists.immutable.ofAll(integers.values()).sum();
IntStream.of(1, 2, 23).sum();
IntStream.of(1, 2, 23,1, 2, 23,1, 2, 23).max().getAsInt();
Integer sum= listInt.stream().collect(Collectors.summingInt(Integer::intValue));
mapToLong
来避免溢出。 - Alexis C.foo(int i)
的人不会每次调用它时都写foo(myInteger.intValue());
(或者至少我希望如此!!)。我同意您的看法,即Integer::intValue
更加明确,但我认为同样适用于这里。人们只需要学习一次,然后就完成了 :-)。这不像是一些神奇的混淆技术。 - Alexis C.Integer.intValue()
方法,但更深入底层,该方法会被内联成与源代码中看起来完全一样的no-op。 使用Integer :: intValue
有额外的好处,即不会在字节码中创建合成方法,但这不应驱动您决定如何组织源代码。 - Holger