【问题标题】:Count properties of objects in list using java 8使用java 8计算列表中对象的属性
【发布时间】:2016-04-11 08:56:26
【问题描述】:

假设我有一个对象AnimalArraylist。对象的那个类是这样的:

class Animal{
    String Name;//for example "Dog"
    String Color
}

我想要做的是计算ArrayList 中每种动物存在多少种不同颜色,并将它们放在Map<String,Integer> 中,其中String 是名称,Integer 是不同颜色的数量.

例如,如果有 4 条黑狗和 1 条白狗,则对应的放到地图上的是

map.put("Dog",2);

我知道可以使用 Stream 来完成,但我不知道怎么做。

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    您要做的是使用名称属性作为键的grouping operation。这是最容易的部分。更棘手的是将“不同颜色的计数”表示为下游收集器。由于 JRE 中没有这样的收集器,我们必须构建一个,使用 Set 存储。请注意,即使有一个内置的,它也必须在引擎盖下使用类似的存储空间。所以我们通过查询大小来map the elements 到颜色、collect them into Sets(这意味着只保留不同的值)和finish

    Map<String, Integer> map = animalStream.collect(
        Collectors.groupingBy(Animal::getName,
            Collectors.collectingAndThen(
                Collectors.mapping(Animal::getColor, Collectors.toSet()),
                Set::size)));
    

    【讨论】:

      【解决方案2】:

      这应该可行:

          Map<String, Integer> map = animal.stream().collect(
                  Collectors.groupingBy(
                          Animal::getName,
                          Collectors.collectingAndThen(
                                  Collectors.mapping(Animal::getColor, Collectors.toSet()),
                                  Set::size)
                          )
                  );
      

      这里有一些测试代码:

      public static void main(String[] args) {
          List<Animal> animal = new ArrayList<>();
          animal.add(new Animal("Dog","black"));
          animal.add(new Animal("Dog","black"));
          animal.add(new Animal("Dog","blue"));
          animal.add(new Animal("Cat","blue"));
          animal.add(new Animal("Cat","white"));
      
          Map<String, Integer> map = animal.stream().collect(
                  Collectors.groupingBy(
                          Animal::getName,
                          Collectors.collectingAndThen(
                                  Collectors.mapping(Animal::getColor, Collectors.toSet()),
                                  Set::size)
                          )
                  );
      
          for(Entry<String, Integer> entry:map.entrySet()) {
              System.out.println(entry.getKey()+ " : "+entry.getValue());
          }
      
      }
      

      给予

      Cat : 2
      Dog : 2
      

      注意:此答案的灵感来自此 SO 帖子:https://stackoverflow.com/a/30282943/1138523

      【讨论】:

      • 如果需要,您可以使用 Map::forEach 作为测试代码: map.forEach((key, value) -> System.out.println(key + " : " + value) );
      猜你喜欢
      • 2016-11-24
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多