Java 8流库|分组列表的元素和计数

时间:2015-10-30 07:19:58

标签: java java-8 java-stream

我有一个list<Person>,我想要的是按Person.age将列表元素分组到一个HashMap中,其中键是Person.age,value是组中元素的数量。

Class Person { String name; int age; }

然后我使用以下行对它们进行分组:

Map<Integer,List<Person>> groupByAgeMap = personList.stream() .collect(Collectors.groupingBy(Person::getAge));

但我真正想要的是一个Map,其中map key = Person.age和value =该年龄列表中元素的数量。

现在我正在通过以下线实现它:

Map<Integer,Integer> groupByAgeCountMap = new HashMap<>(); groupByAgeMap.forEach((k, v) -> groupByAgeCountMap.put(k, v.size()));

但是我感觉不对,因为我正在迭代MAP。必须有一些使用流媒体的直接方式。任何帮助将不胜感激。

给出完整的例子::

package com.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Person {
    String name;
    int age;
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(int age) {
        this.age = age;
    }
}

public class GroupPerson {
    public Map<Integer,Integer> getTimesOfferOpened() {
        List<Person> personList = new ArrayList<>();

        Person person1 = new Person();
        person1.setName("Person1");
        person1.setAge(10);

        Person person2 = new Person();
        person2.setName("Person2");
        person2.setAge(10);

        Person person3 = new Person();
        person3.setName("Person3");
        person3.setAge(8);

        personList.add(person1);
        personList.add(person2);
        personList.add(person3);

        Map<Integer,List<Person>> personGroupdByAgeMap = personList.stream().collect(Collectors.groupingBy(Person::getAge));

        // Truncating all the data and returning the map only with count
        Map<Integer,Integer> numberOfPersonCountByAgeMap = new HashMap<>();
        personGroupdByAgeMap.forEach((k, v) -> numberOfPersonCountByAgeMap.put(k, v.size()));
        return numberOfPersonCountByAgeMap;
    }

    public static void main(String args) {
        GroupPerson obj = new GroupPerson();
        System.out.println(obj.getTimesOfferOpened());
    }
}

1 个答案:

答案 0 :(得分:0)

我能够通过以下方式实现它:

Map<Integer,Long> personGroupdByAgeMap = personList.stream() .collect(Collectors.groupingBy(Person::getCount, Collectors.counting())) ;