[Java] 21. 스트림 중간연산


스트림의 중간연산에 대해서 포스팅이다.


1. 스트림의 중간연산

중간 연산자는 스트림을 반환하며, 연속적으로 연산을 수행할 수 있다. 이들은 ‘게으른(lazy)’ 특성을 갖고 있어 최종 연산이 호출되기 전까지 실제 요소를 처리하지 않습니다. 주로 데이터를 변환하거나 필터링하고, 스트림의 요소를 수정하지 않고 새로운 스트림을 생성한다.


중간 연산설명
Stream<T> filter(Predicate<? super T> predicate)주어진 조건에 맞는 요소만을 걸러냅니다.
<R> Stream<R> map(Function<? super T, ? extends R> mapper)요소들을 다른 형태로 변환합니다.
flatMap(Function<? super T, ? extends Stream<? extends R» mapper)각 요소에 대해 매핑 함수를 적용하고, 이 함수는 각 요소를 다른 스트림으로 변환
Stream<T> distinct()중복을 제거합니다.
Stream<T> sorted()요소들을 정렬합니다.
Stream<T> sorted(Comparator<? super T> comparator)요소들을 정해진 순서대로 정렬합니다.
Stream<T> limit(long maxSize)요소 개수를 제한합니다.
Stream<T> skip(long n)처음 몇 개의 요소를 건너뜁니다.
Stream<T> peek(Consumer<? super T> action)각 요소를 가져와서 추가적인 작업을 수행하고 스트림을 반환합니다.

위의 각 중간 연산은 스트림을 변환하거나 필터링하거나 제한하는 등 다양한 작업을 수행합니다. 이러한 중간 연산자들을 조합하여 다양한 데이터 처리 작업을 할 수 있습니다.



◼︎ filter()

stream.filter() 메서드는 filter 내 조건이 true를 만족하는 요소들만을 선택하여 새로운 스트림을 반환한다.

List<AccSubItem> filter1 = AccSubItems.stream().filter(accSubItem -> accSubItem.getAccAmt().compareTo(new BigDecimal(100000)) >= 0)
                                                .collect(Collectors.toList());



◼︎ map()

stream.map() 메서드는 스트림 내의 요소를 다른 형태로 변환하는 중요한 연산이다.

  • <R> Stream<R> map(Function<? super T, ? extends R> mapper)
  • 요소들을 다른 형태로 변환합니다.
  • [Java] Stream Map 연산
AccSubItems.stream().map(AccSubItem::getAccId)
                    .map(e -> e.replaceAll("A", "B"))
                    .forEach(System.out::println);



◼︎ flatMap()

stream.flatMap()은 중첩된 구조의 요소들을 평면화(flatten)하는 데 사용된다.

  • flatMap(Function<? super T, ? extends Stream<? extends R» mapper)
  • 각 요소에 대해 매핑 함수를 적용하고, 이 함수는 각 요소를 다른 스트림으로 변환
  • [Java] Stream FlatMap 연산
Stream<List<AccSubItem>> streamList = Stream.of(AccSubItems1, AccSubItems2);

//2개의 stream 을 flatMap() 으로 연산하는 경우
//아래와 같이 하나의 Stream 으로 병합되는 데이터 구조이다.
Stream<AccSubItem> retFlatMap = streamList.flatMap(List::stream);
retFlatMap.forEach(System.out::println);



◼︎ distinct()

stream.distinct() 메서드는 중복된 요소를 제거하여 고유한(unique) 요소들만으로 이루어진 스트림을 반환한다.

List<String> distinctTypeList = AccSubItems.stream().map(AccSubItem::getDepWdrTypCd)
                                                    .distinct()
                                                    .collect(Collectors.toList());



◼︎ sorted()

List<AccSubItem> defaultSortedList = AccSubItems.stream().sorted()
                                                            .collect(Collectors.toList());



◼︎ peek()

stream.peek()` 메서드는 중간 연산자로 스트림의 요소를 확인하거나 디버깅 목적으로 사용됩니다. peek() 메서드를 사용하여 스트림의 각 요소를 처리하고, 처리된 요소를 그대로 반환합니다.

  • Stream<T> peek(Consumer<? super T> action)
  • 각 요소를 가져와서 추가적인 작업을 수행하고 스트림을 반환합니다.
  • [Java] Stream Peek 연산
List<Integer> list = AccSubItems.stream()
                                .map(AccSubItem::getAccId)
                                .peek(e -> System.out.println("[STEP-1] AccId: " + e))
                                .filter(e -> e.contains("A"))
                                .peek(e -> System.out.println("  [STEP-2] A시작 Filter: " +e))
                                .map(e -> e.replaceAll("A", ""))
                                .map(Integer::parseInt)
                                .peek(e -> System.out.println("    [STEP-3] Replace 후 Integer 변환: " + e))
                                .filter(e -> e < 400)
                                .peek(e -> System.out.println("      [STEP-4] 400 이하 Filter: " + e))
                                .sorted()
                                .peek(e -> System.out.println("[ORDER] Sorted: " + e))
                                .collect(Collectors.toList());




[출처]

  • 자바의정석 (저자: 남궁성)