반응형
스트림은 최종 처리 단계에서 요소들을 수집하는 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()));
}
예제코드는 이것이 자바다 책을 참고하였습니다.
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] Stream 요소를 그룹핑해서 수집하기(Collectors.groupingBy) (0) | 2020.01.09 |
---|---|
[JAVA] Stream 사용자 정의 컨테이너에 수집하기(collect()) (0) | 2020.01.07 |
[JAVA] Stream 매칭(allMatch(), anyMatch(), noneMatch()) (0) | 2020.01.07 |
[JAVA] Optional 사용해서 null-safety한 코드짜기 (0) | 2019.11.25 |
[JAVA] LocalDate, LocalDateTime, LocalTime 문자열 파싱(parsing), 포맷팅(Formatting) (0) | 2019.10.23 |