您的位置:首页 > 编程语言 > Java开发

Java 8 Collectors: groupingBy Example

2017-03-05 09:54 218 查看


Java 8 Collectors: groupingBy Example

By Arvind Rai, November 29, 2014
groupingBy is a static method of java.util.stream.Collectors in java 8. groupingBy does the grouping of elements on the basis of any given key and returns a Collector. Find the method syntax.

<T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)


For the example, we will create a Student class. 
Student.java

package com.concretepage.util.stream;
public class Student {
private String name;
private int age;
private String className;
public Student(String name,String className,int age){
this.name=name;
this.age=age;
this.className = className;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getClassName() {
return className;
}
}


Now if we want to group students on the basis of className, we will do as below.

Map<String, List<Student>> stdByClass = list.stream()
.collect(Collectors.groupingBy(Student::getClassName));


We have a list of Student class. Grouping is done on the basis of student class name. List is converted into stream of student object. Then call collect method of stream. groupingBy of Collectors class checks each element of stream and gets class name and then
group it as list. Finally we get a map where key is the one by which grouping is done. Find the complete example. 
CollectorsGroupingBy.java

package com.concretepage.util.stream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CollectorsGroupingBy {
public static void main(String[] args) {
Student s1 = new Student("Ram", "A", 20);
Student s2 = new Student("Shyam", "B", 22);
Student s3 = new Student("Mohan", "A", 22);
Student s4 = new Student("Mahesh", "C", 20);
Student s5 = new Student("Krishna", "B", 21);
List<Student> list = Arrays.asList(s1,s2,s3,s4,s5);
//Group Student on the basis of ClassName
System.out.println("----Group Student on the basis of ClassName----");
Map<String, List<Student>> stdByClass = list.stream() .collect(Collectors.groupingBy(Student::getClassName));

stdByClass.forEach((k,v)->System.out.println("Key:"+k+" "+
((List<Student>)v).stream().map(m->m.getName()).collect(Collectors.joining(","))));

//Group Student on the basis of age
System.out.println("----Group Student on the basis of age----");
Map<Integer, List<Student>> stdByAge = list.stream()
.collect(Collectors.groupingBy(Student::getAge));

stdByAge.forEach((k,v)->System.out.println("Key:"+k+" "+
((List<Student>)v).stream().map(m->m.getName()).collect(Collectors.joining(","))));
}
}


Find the output.

----Group Student on the basis of ClassName----
Key:A  Ram,Mohan
Key:B  Shyam,Krishna
Key:C  Mahesh
----Group Student on the basis of age----
Key:20  Ram,Mahesh
Key:21  Krishna
Key:22  Shyam,Mohan


Tweet
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: