[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를 만족하는 요소들만을 선택하여 새로운 스트림을 반환한다.
- Stream<T> filter(Predicate<? super T> predicate)
- 주어진 조건에 맞는 요소만을 걸러냅니다.
- [Java] Stream Filter 연산
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) 요소들만으로 이루어진 스트림을 반환한다.
- Stream<T> distinct()
- 중복을 제거합니다.
- [Java] Stream Distinct 연산
List<String> distinctTypeList = AccSubItems.stream().map(AccSubItem::getDepWdrTypCd)
.distinct()
.collect(Collectors.toList());
◼︎ sorted()
- Stream<T> sorted()
- Stream<T> sorted(Comparator<? super T> comparator)
- 요소들을 정렬합니다.
- [Java] Stream Sort 연산
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());
[출처]
- 자바의정석 (저자: 남궁성)