- Given a list of Person objects (POJOs).
- We would like to group person objects by their gender.
- Group person objects by Male & Female.
- We will also apply mapping & statistics features on list of person objects.
1. Apply groupBy, mapping & statistics features on person POJOs
- Group person objects by gender i.e Male and Female
- Get the List of person objects (Categorized by gender)
- Group persons by gender i.e Male and Female
- Get the Set of person objects
- Group persons by gender i.e Male and Female
- Get the Set of names (of person) objects instead of complete person objects
- Count person objects by gender
- Number of females and males in person objects
- Group person objects by gender and get person with max age
- Max age of male and female persons
- Group person objects by gender and generate age statistics
- Generate age statistics of person objects
- Get avg, min and max age etc of male and female objects
2. Program – groupBy, mapping & statistics features (java8 lambda stream)
2.1.) Person Class:
- Person POJO containing attributes of Person.
- Apply groupBy, mapping & statistics features on person objects.
package org.learn.GroupByJava8;
public class Person {
public String name;
public int age;
public String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String toString() {
return "[" + name + " " + age + " " +gender +"]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
2.2 GroupByJava8 Class:
- GroupByJava class will demonstrates the following features.
- groupBy: We will group person objects by theirs attributes.
- Group person objects by genders.
- mapping: We will map person objects to the set containing names of Person pojos etc.
- statistics (IntSummaryStatistics):
- We will group person pojos by genders.
- We will generate age statistics of grouping (step1) like min, max or average age of male persons.
- groupBy: We will group person objects by theirs attributes.
The GroupByJava8 example is as follows:
package org.learn.GroupByJava8;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class GroupByJava8
{
public static void main( String[] args )
{
List <Person> personList = new ArrayList<Person>();
personList.add(new Person("Sharon", 21, "Female"));
personList.add(new Person("Maria", 18, "Female"));
personList.add(new Person("Jack", 21 ,"Male"));
personList.add(new Person("James", 35, "Male"));
Map<String, List<Person>> groupByGenderList =
personList.stream().collect(Collectors.groupingBy(Person::getGender));
//Group by gender List : Female-> Persons and Male -> Persons
System.out.println("1. Group persons by gender - get result in List: ");
System.out.println(groupByGenderList.toString());
Map<String, Set<Person>> groupByGenderSet =
personList.stream().collect(Collectors.groupingBy(Person::getGender,Collectors.toSet()));
//Group by gender Set: Female-> Persons and Male -> Persons
System.out.println("2. Group persons by gender - get result in Set: ");
System.out.println(groupByGenderSet.toString());
Map<String, Set<String>> groupByGenderAndFirstNameSet
= personList.stream().collect(Collectors.groupingBy(Person::getGender, TreeMap::new,
Collectors.mapping(Person::getName, Collectors.toSet())));
System.out.println("3. Group person by gender and get name of person - get result in Set: ");
System.out.println(groupByGenderAndFirstNameSet.toString());
Map<String, Long> countPersonByGender = personList.stream().
collect(Collectors.groupingBy(Person::getGender,Collectors.counting()));
System.out.println("4. Count person objects by gender: ");
System.out.println(countPersonByGender.toString());
Map<String, Optional<Person>> personByMaxAge = personList.stream().
collect(Collectors.groupingBy(Person::getGender
,Collectors.maxBy(Comparator.comparing(Person::getAge))));
System.out.println("5. Group person objects by gender and get person with max age: ");
System.out.println(personByMaxAge.toString());
Map<String, IntSummaryStatistics> groupPersonsByAge = personList.stream().
collect(Collectors.groupingBy(Person::getGender
,Collectors.summarizingInt(Person::getAge)));
System.out.println("6. Group person objects by gender and get age statistics: ");
System.out.println(groupPersonsByAge.toString());
IntSummaryStatistics malesAge = groupPersonsByAge.get("Male");
System.out.println("Avgerage male age:"+ malesAge.getAverage());
System.out.println("Max male age:"+ malesAge.getMax());
System.out.println("Min male age:"+ malesAge.getMin());
}
}
3. Output: groupBy, mapping & IntSummaryStatistics features in java8
1. Group persons by gender - get result in List:
{Male=[[Jack 21 Male], [James 35 Male]], Female=[[Sharon 21 Female], [Maria 18 Female]]}
2. Group persons by gender - get result in Set:
{Male=[[James 35 Male], [Jack 21 Male]], Female=[[Maria 18 Female], [Sharon 21 Female]]}
3. Group person by gender and get name of person - get result in Set:
{Female=[Sharon, Maria], Male=[James, Jack]}
4. Count person objects by gender:
{Male=2, Female=2}
5. Group person objects by gender and get person with max age:
{Male=Optional[[James 35 Male]], Female=Optional[[Sharon 21 Female]]}
6. Group person objects by gender and get age statistics:
{Male=IntSummaryStatistics{count=2, sum=56, min=21, average=28.000000, max=35},
Female=IntSummaryStatistics{count=2, sum=39, min=18, average=19.500000, max=21}}
Avgerage male age:28.0
Max male age:35
Min male age:21
