【问题标题】:Collecting occurrences in a HashMap with streams使用流收集 HashMap 中的事件
【发布时间】:2019-01-04 18:43:18
【问题描述】:

我有一个练习要解决。我有一个 Fox 类,它有名称和颜色字段。我的练习是通过颜色找到狐狸的频率。

因此我创建了一个 HashMap,其中 String 属性将是狐狸名称,而 Integer 将是事件本身:

    Map<String, Integer> freq = new HashMap<>();

完成之后,我一直在尝试使用流编写代码,但我很难做到这一点。我写了这样的东西:

    foxes.stream()
    .map(Fox::getColor)
    .forEach()
    //...(continued later on);

,其中 foxes 是一个列表。

我的问题基本上是语法。如果颜色没有出现,我想做一些事情

    freq.put(Fox::getName, 1)

其他

    freq.replace(Fox::getName, freq.get(Fox::getName) + 1)

我应该如何组合?

【问题讨论】:

  • 恕我直言,问题的后半部分混淆了最初的动机。在那里混合名称和颜色会改变完整的问题意图。

标签: java java-8 hashmap java-stream method-reference


【解决方案1】:

我不建议继续你的方法,因为已经有一个内置的收集器,即groupingBy 收集器,counting() 作为下游:

 Map<String, Long> result = foxes.stream()
      .collect(Collectors.groupingBy(Fox::getName, Collectors.counting()));

这通过“名称”找到频率,同样,您可以通过更改分类函数通过颜色获得频率。

foxes.stream()
     .collect(Collectors.groupingBy(Fox::getColor, Collectors.counting()));

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多