使用流收集HashMap中的事件

时间:2019-01-04 18:43:19

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

我有一个练习要解决。我有一个Fox类,其中有名称和颜色字段。我的工作是按颜色查找狐狸的频率。

因此,我创建了一个HashMap,其中String属性将是fox名称,而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)

我应该如何将它们放在一起?

1 个答案:

答案 0 :(得分:6)

我不建议继续使用您的方法,因为已经有一个内置的收集器,即groupingBy收集器,其中counting()位于下游:

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.SaveToken = true;
            options.Authority = "https://localhost:44300/ids",
            options.RequireHttpsMetadata = false;
            options.Audience = "iqimplict";
        });

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

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