package com.levelup.java.util.stream; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; /** * This java example will demonstrate how to use the Stream.groupingBy. * * @author Justin Musgrove * @see <a href= * 'http://www.leveluplunch.com/java/examples/java-util-stream-groupingBy-example/'>Stream * groupingBy</a> */ public class StreamGroupBy { private static final Logger logger = Logger.getLogger(StreamGroupBy.class); class StudentClass { private String teacher; private double level; private String className; public StudentClass(String teacher, double level, String className) { super(); this.teacher = teacher; this.level = level; this.className = className; } public String getClassName() { return className; } public String getTeacher() { return teacher; } public double getLevel() { return level; } @Override public String toString() { return com.google.common.base.Objects.toStringHelper(this) .add("teacher", teacher).add("level", level) .add("className", className).toString(); } } private List<StudentClass> studentClasses; @Before public void setUp() { studentClasses = new ArrayList<>(); studentClasses.add(new StudentClass("Kumar", 101, "Intro to Web")); studentClasses.add(new StudentClass("White", 102, "Advanced Java")); studentClasses.add(new StudentClass("Kumar", 101, "Intro to Cobol")); studentClasses.add(new StudentClass("Sargent", 101, "Intro to Web")); studentClasses.add(new StudentClass("Sargent", 102, "Advanced Web")); } @Test public void group_by_teacher_name() { Map<String, List<StudentClass>> groupByTeachers = studentClasses .stream().collect( Collectors.groupingBy(StudentClass::getTeacher)); logger.info(groupByTeachers); assertEquals(1, groupByTeachers.get("White").size()); } @Test public void group_by_level() { Map<Double, List<StudentClass>> groupByLevel = studentClasses.stream() .collect(Collectors.groupingBy(StudentClass::getLevel)); logger.info(groupByLevel); assertEquals(3, groupByLevel.get(101.0).size()); } @Test public void group_by_count() { Map<Double, Long> groupByLevel = studentClasses.stream().collect( Collectors.groupingBy(StudentClass::getLevel, Collectors.counting())); logger.info(groupByLevel); assertEquals(2.0, groupByLevel.get(102.0), 0); } }