【问题标题】:using java Stream to get a sum, average, and sort使用 java Stream 获取总和、平均值和排序
【发布时间】:2018-02-21 12:58:26
【问题描述】:

我正在学习 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");
    }
}

【问题讨论】:

  • 是我还是你的代码不完整? sumcountavg是如何初始化的?
  • 您看过 Streams API 吗?它告诉您存在哪些方法。 Oracle 网站上有很多很多信息。
  • 另外,来自 streamable 的 .count() 会为您提供该流中元素的 number 个。
  • 它不完整,所以我需要几行代码来计算那些 system.out.println() 并且我不知道如何获得总和、平均值和排序。
  • 从这里开始:docs.oracle.com/javase/8/docs/api/java/util/stream/… 该示例甚至显示了求和的示例代码。

标签: java java-8 java-stream


【解决方案1】:
IntSummaryStatistics stats = Arrays.asList(1,2,3,4)
    .stream()
    .mapToInt(Integer::intValue)
    .summaryStatistics();

stats.getSum();
stats.getCount();
stats.getAverage();

对于排序,您将不得不再次流式传输。

【讨论】:

  • Arrays.asList(1,2,3,4) .stream() .collect(Collectors.summarizingInt(Integer::intValue));
  • @Holger 有没有办法知道何时选择一种实现?我的意思是,很多时候,有些操作可以通过流中间操作或收集器来完成,即Stream.map vs Collectors.mapping、减少、过滤、平面映射和汇总等
  • @FedericoPeraltaSchaffner 对于这种特殊情况,没关系,选择权在你。两者都值得了解,因为当您想要扩展代码时可能会有所不同,有关详细信息,请参阅this answer。还有this one.
  • @Eugene IntSummaryStatistics 的想法终于成为了最近的记忆 :)
【解决方案2】:

你可以这样做:

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()));

【讨论】:

    【解决方案3】:

    list.stream().count() 有效但list.stream().sum() 无效的原因是因为list.stream() 返回一个Stream&lt;Integer&gt; 并且有一个Stream::count 方法,但没有Stream::sumStream::average .

    要首先获得总和和平均值,您必须将Stream&lt;Integer&gt; 中的每个整数值映射到list.stream() 时获得的IntStream。这是 Stream 的 int 原始特化。这可以使用Stream::mapToInt 方法完成:

    list.stream().mapToInt(Integer::intValue)
    

    这样做你可以使用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());
    

    或者更好的是,您可以使用IntStream::summaryStatistics 来获得总和、计数和平均值(还有最小值和最大值):

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

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

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

    Here 是一篇很好的帖子,可以帮助您了解如何使用 Java 8 Stream Api。

    【讨论】:

      【解决方案4】:

      您应该使用mapToIntmapToDouble

      您可以通过forEach(System.out::println)打印列表

      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().count());
      
      System.out.println("average by using Stream : " + list.stream().mapToInt(Integer::intValue).average());
      
      System.out.println("sort by using Stream: " );
      
      list.stream().sorted().forEach(System.out::println);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-17
        • 2021-10-25
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 2018-09-09
        • 2018-02-23
        • 2016-06-30
        相关资源
        最近更新 更多