我有一个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());
}
}
答案 0 :(得分:0)
我能够通过以下方式实现它:
Map<Integer,Long> personGroupdByAgeMap = personList.stream() .collect(Collectors.groupingBy(Person::getCount, Collectors.counting())) ;