使用java Stream获取总和,平均值和排序

Kin*_*nho 6 java java-8 java-stream

我正在学习java Stream,并且很难解决下面的问题.我被卡住的原因是因为我不知道如何处理Stream<Integer>.

我偶然发现了"计数"的解决方案list.stream().count(),但除此之外,我无法继续前进.请帮助我如何处理这些问题并告诉我为什么list.stream().count()在这种情况下工作.到目前为止,我已经尝试了所学到的一切.

public class Question {
    public static void main(String[] args) {
        List<Integer>list = Arrays.asList(5,3,4,1,2);
        System.out.println("sum by using Stream : " + sum);
        System.out.println("count by using Stream: " + count);
        System.out.println("average by using Stream : " + avg);
        System.out.println("sort by using Stream");
    }
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 20

IntSummaryStatistics stats = Arrays.asList(1,2,3,4)
    .stream()
    .mapToInt(Integer::intValue)
    .summaryStatistics();

stats.getSum();
stats.getCount();
stats.getAverage();
Run Code Online (Sandbox Code Playgroud)

对于已排序,您将不得不再次流.

  • 或者`Arrays.asList(1,2,3,4).stream().collect(Collectors.summarizingInt(Integer :: intValue));` (4认同)
  • @FedericoPeraltaSchaffner针对这个具体案例,无关紧要,选择权归你所有.值得了解两者,因为当您想扩展代码时可能会有所不同,请参阅[此答案](/sf/answers/2591750171/)了解详细信息.并[这一个](/sf/answers/3098134301/). (3认同)

Jua*_*oza 9

之所以list.stream().count()有效但list.stream().sum()不是因为list.stream()返回a Stream<Integer>并且有Stream::count方法,但是没有Stream::sum或者Stream::average.

为了得到总和与AVG首先你要映射在每一个整数值Stream<Integer>,当你这样做,你会得到list.stream()一个IntStream.这是Stream的int原始特化.这可以使用以下Stream::mapToInt方法完成:

list.stream().mapToInt(Integer::intValue)
Run Code Online (Sandbox Code Playgroud)

这样做你可以使用方法IntStream::sumIntStream::average:

System.out.println("sum by using Stream : " + list.stream().mapToInt(Integer::intValue).sum());
System.out.println("average by using Stream : " + list.stream().mapToInt(Integer::intValue).average());
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,您可以使用它IntStream::summaryStatistics来获得总和,计数和平均值(也包括最小值和最大值):

System.out.println("sum, count, avg, min and max using Stream : " + list.stream().mapToInt(Integer::intValue).summaryStatistics());
Run Code Online (Sandbox Code Playgroud)

要对值进行排序,您可以使用以下Stream::sorted方法:

System.out.println("sort by using Stream: " + list.stream().sorted().collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

是一篇很好的文章,可以帮助您了解如何使用Java 8 Stream Api.


Yar*_*lav 4

你可以这样做:

List<Integer> list = Arrays.asList(5,3,4,1,2);
        System.out.println("sum by using Stream : " + list.stream().mapToInt(Integer::intValue).sum());
        System.out .println("count by using Stream: " + list.stream().mapToInt(Integer::intValue).count());
        System.out.println("average by using Stream : " + list.stream().mapToInt(Integer::intValue).average());
        System.out.println("sort by using Stream: " + list.stream().sorted().collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)