상세 컨텐츠

본문 제목

[Stream] Collect - groupingBy : 컬렉션 요소를 그룹핑해서 Map객체 얻기

Java

by kwanghyup 2020. 6. 18. 16:26

본문

1. 성별을 키값으로 리스트 그룹핑 하기 

public class Person {
    enum Gender{ MALE, FEMALE }
    enum City{ Seoul, Pusan }

    private  String name;
    private Gender gender;
    private  int score;
    private City city;

    public Person(String name, int score, Gender gender) {
        this.name = name;
        this.score = score;
        this.gender = gender;
    }

    public Person(String name, int score, Gender gender, City city) {
        this.name = name;
        this.gender = gender;
        this.score = score;
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    }

    public Gender getGender() {
        return gender;
    }

    public City getCity() {
        return city;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + '\'' + ", gender=" + gender + ", score=" + score + ", city=" + city + '}';
    }
}

 

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class GroupingExam {

    public static void main(String[] args) {

        List<Person> personList = Arrays.asList(

                new Person("lee",9, Person.Gender.MALE, Person.City.Pusan),
                new Person("kim",5, Person.Gender.FEMALE, Person.City.Seoul),
                new Person("park",6, Person.Gender.FEMALE,Person.City.Pusan),
                new Person("sin",3, Person.Gender.FEMALE, Person.City.Seoul ),
                new Person("hong",4, Person.Gender.MALE, Person.City.Seoul),
                new Person("ahn",7, Person.Gender.MALE,Person.City.Pusan),
                new Person("moo",1, Person.Gender.MALE, Person.City.Seoul)
        );

        // 성별로 그룹핑
        Map<Person.Gender, List<Person>> mapByGender =
                personList.stream().collect(
                        Collectors.groupingBy(new Function<Person, Person.Gender>() {
                            @Override
                            public Person.Gender apply(Person person) {
                                return person.getGender(); // key값 결정
                            }
                        })
                );

        mapByGender.get(Person.Gender.MALE).stream().forEach(System.out::println);
        System.out.println("======================================================");
        mapByGender.get(Person.Gender.FEMALE).stream().forEach(System.out::println);
    }
}

 

/* 메소드 참조 */
Map<Person.Gender, List<Person>> mapByGender =
             personList.stream().collect(Collectors.groupingBy(Person::getGender));

 

2. 도시를 키값으로 그룹핑 

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingExam {

    public static void main(String[] args) {

        List<Person> personList = Arrays.asList(

                new Person("lee", 9, Person.Gender.MALE, Person.City.Pusan),
                new Person("kim", 5, Person.Gender.FEMALE, Person.City.Seoul),
                new Person("park", 6, Person.Gender.FEMALE, Person.City.Pusan),
                new Person("sin", 3, Person.Gender.FEMALE, Person.City.Seoul),
                new Person("hong", 4, Person.Gender.MALE, Person.City.Seoul),
                new Person("ahn", 7, Person.Gender.MALE, Person.City.Pusan),
                new Person("moo", 1, Person.Gender.MALE, Person.City.Seoul)
        );

        // 도시로 그룹핑
        Map<Person.City, List<Person>> mapByCity =
        personList.stream().collect(Collectors.groupingBy(Person::getCity));

        mapByCity.get(Person.City.Pusan).stream().forEach(System.out::println);
        System.out.println("==================================================");
        mapByCity.get(Person.City.Seoul).stream().forEach(System.out::println);

    }
}

관련글 더보기

댓글 영역