프로그래밍 노트/JAVA

[JAVA] Stream 필터링한 요소 수집(collect())

깡냉쓰 2020. 1. 7. 22:22
728x90
반응형

스트림은 최종 처리 단계에서 요소들을 수집하는 collect()를 제공하고 있다.
이 메소드를 이용하면 필요한 요소만 컬렉션으로 담을 수 있고, 요소들을 그룹핑한 후 집계(리덕션)할 수 있다.

필터링한 요소 수집

Stream의 collect(Collector<T, A, R> collector) 메소드는 필터링, 매핑된 요소들을 새로운 컬렉션에 수집해서 리턴한다.
매개값인 Collector는 어떤 요소어떤 컬렉션에 수집할 것인가를 나타낸다.
타입 파라미터의 의미(T, A, R)
T ⇒ 요소
A ⇒ 누적기(accumulator)
R ⇒ 저장될 컬렉션
T 요소를 A 누적기가 R에 저장한다는 의미가 된다.

Collector의 구현객체는 Collectors 클래스의 정적 메소드를 이용해서 이용할 수 있다.
참고) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html

자주 사용되는 static 메소드

  • toList()
  • toSet()
  • toCollection(Supplier<Collection<T>>)
  • toMap(Function<T, K> keyMapper, Function<T, U> valueMapper)

toCollection : T를 Supplier가 제공한 Collection에 저장
toMap : T를 K와 U로 매핑해서 K를 키로, U를 값으로 Map에 저장함을 뜻한다.

전체 학생 중에서 남학생들만 필터링해서 별도의 List를 생성

Stream<Student> totalStream = totalList.stream();
Stream<Student> maleStream = totalStream.filter(s -> s.getSex() == Student.Sex.MALE);

Collector<Student, ?, List<Student>> collector = Collectors.toList(); // Student를 List<Student>로 저장하겠다.
List<Student> maleList = maleStream.collect(collector);

위의 코드는 아래와 같이 간단하게 작성할 수 있다.

List<Student> maleList = totalList.stream()
            .filter(s -> s.getSex() == Student.Sex.MALE)
            .collect(Collectors.toList());

여학생들을 HashSet으로 수집해보자.

Stream<Student> totalStream = totalList.stream();
Stream<Student> maleStream = totalStream.filter(s -> s.getSex() == Student.Sex.FEMALE);

Supplier<HashSet<Student>> supplier = HashSet::new; // 메소드 참조
Collector<Student, ?, HashSet<Student>> collector = Collectors.toCollection(supplier);
Set<Student> femaleSet = maleStream.collect(collector);

위의 코드 또한 아래와 같이 간단하게 작성할 수 있다.

Set<Student> femaleSet = totalList.stream()
            .filter(s -> s.getSex() == Student.Sex.MALE)
            .collect(Collectors.toCollection(HashSet::new));

전체코드

public static void main(String[] args) {
      List<Worker> totalList = Arrays.asList(
              new Worker("강성현", 30, Worker.Sex.MALE),
              new Worker("여자강성현", 25, Worker.Sex.FEMALE),
              new Worker("깡냉", 20, Worker.Sex.MALE),
              new Worker("까랭", 50, Worker.Sex.FEMALE)
      );

      // 남자 일꾼만 모아서 List로 생성
      List<Worker> maleList = totalList.stream()
              .filter(s -> s.getSex() == Worker.Sex.MALE)
              .collect(Collectors.toList());

      maleList.stream()
              .forEach(s -> System.out.println(s.getName()));

      System.out.println();

      // 여자 일꾼만 모아서 HashSet으로 생성
      Set<Worker> femaleSet = totalList.stream()
              .filter(s -> s.getSex() == Worker.Sex.FEMALE)
              .collect(Collectors.toSet());

      femaleSet.stream()
              .forEach(s-> System.out.println(s.getName()));
}

예제코드는 이것이 자바다 책을 참고하였습니다.

728x90
반응형