我想对一个整数列表求和。它的工作原理如下,但是语法感觉不太对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
我想对一个整数列表求和。它的工作原理如下,但是语法感觉不太对。代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
当前回答
希望这能帮助那些在清单上有物品的人。
如果您有一个对象列表,并且想要对该对象的特定字段求和,请使用下面的方法。
List<ResultSom> somList = MyUtil.getResultSom();
BigDecimal result= somList.stream().map(ResultSom::getNetto).reduce(
BigDecimal.ZERO, BigDecimal::add);
其他回答
你可以使用reduce方法:
long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, (x, y) -> x + y);
or
long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, Integer::sum);
来自文档
Reduction operations A reduction operation (also called a fold) takes a sequence of input elements and combines them into a single summary result by repeated application of a combining operation, such as finding the sum or maximum of a set of numbers, or accumulating elements into a list. The streams classes have multiple forms of general reduction operations, called reduce() and collect(), as well as multiple specialized reduction forms such as sum(), max(), or count(). Of course, such operations can be readily implemented as simple sequential loops, as in: int sum = 0; for (int x : numbers) { sum += x; } However, there are good reasons to prefer a reduce operation over a mutative accumulation such as the above. Not only is a reduction "more abstract" -- it operates on the stream as a whole rather than individual elements -- but a properly constructed reduce operation is inherently parallelizable, so long as the function(s) used to process the elements are associative and stateless. For example, given a stream of numbers for which we want to find the sum, we can write: int sum = numbers.stream().reduce(0, (x,y) -> x+y); or: int sum = numbers.stream().reduce(0, Integer::sum); These reduction operations can run safely in parallel with almost no modification: int sum = numbers.parallelStream().reduce(0, Integer::sum);
所以,对于一个地图,你会使用:
integers.values().stream().mapToInt(i -> i).reduce(0, (x,y) -> x+y);
Or:
integers.values().stream().reduce(0, Integer::sum);
不幸的是,看起来像流API只返回正常的流,从List<Integer># Stream()。我猜他们是被迫这么做的因为泛型的工作方式。
这些正常的流是泛型对象,所以没有专门的方法,如sum()等,所以你必须使用奇怪的重新流“看起来像一个无操作”转换默认情况下获得这些方法... .mapToInt(i -> i)。
另一种选择是使用“Eclipse Collections”,它就像一个扩展的java流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();
我已经声明了一个整数列表。
ArrayList<Integer> numberList = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
你可以试试下面这些不同的方法。
使用mapToInt
int sum = numberList.stream().mapToInt(Integer::intValue).sum();
使用summarizingInt
int sum = numberList.stream().collect(Collectors.summarizingInt(Integer::intValue)).getSum();
使用减少
int sum = numberList.stream().reduce(Integer::sum).get().intValue();