我想对一个整数列表求和。它的工作原理如下,但是语法感觉不太对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
我想对一个整数列表求和。它的工作原理如下,但是语法感觉不太对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
当前回答
我建议另外两种选择:
integers.values().stream().mapToInt(Integer::intValue).sum();
integers.values().stream().collect(Collectors.summingInt(Integer::intValue));
第二个使用collections . summingint()收集器,还有一个summingLong()收集器,您可以将其与mapToLong一起使用。
第三个选择:Java 8引入了非常有效的LongAdder累加器,旨在加快并行流和多线程环境中的汇总速度。这里有一个例子:
LongAdder a = new LongAdder();
map.values().parallelStream().forEach(a::add);
sum = a.intValue();
其他回答
IntStream.of(1, 2, 23).sum();
IntStream.of(1, 2, 23,1, 2, 23,1, 2, 23).max().getAsInt();
我建议另外两种选择:
integers.values().stream().mapToInt(Integer::intValue).sum();
integers.values().stream().collect(Collectors.summingInt(Integer::intValue));
第二个使用collections . summingint()收集器,还有一个summingLong()收集器,您可以将其与mapToLong一起使用。
第三个选择:Java 8引入了非常有效的LongAdder累加器,旨在加快并行流和多线程环境中的汇总速度。这里有一个例子:
LongAdder a = new LongAdder();
map.values().parallelStream().forEach(a::add);
sum = a.intValue();
这将工作,但i -> i正在做一些自动开箱,这就是为什么它“感觉”奇怪。mapToInt将流转换为“原始int值元素”的IntStream。下面的任何一个都可以工作,并且更好地解释编译器在你的原始语法下所做的事情:
integers.values().stream().mapToInt(i -> i.intValue()).sum();
integers.values().stream().mapToInt(Integer::intValue).sum();
希望这能帮助那些在清单上有物品的人。
如果您有一个对象列表,并且想要对该对象的特定字段求和,请使用下面的方法。
List<ResultSom> somList = MyUtil.getResultSom();
BigDecimal result= somList.stream().map(ResultSom::getNetto).reduce(
BigDecimal.ZERO, BigDecimal::add);
不幸的是,看起来像流API只返回正常的流,从List<Integer># Stream()。我猜他们是被迫这么做的因为泛型的工作方式。
这些正常的流是泛型对象,所以没有专门的方法,如sum()等,所以你必须使用奇怪的重新流“看起来像一个无操作”转换默认情况下获得这些方法... .mapToInt(i -> i)。
另一种选择是使用“Eclipse Collections”,它就像一个扩展的java流API
IntLists.immutable.ofAll (integers.values ()) .sum ();