2024. 10. 5. 11:10ㆍLanguages/JAVA

📝 Modern Java in Action(강력 추천!!)을 통해 Java를 공부하고 있습니다. 해당 내용을 공부하고 까먹지 않기 위해, 제 언어로 정리합니다. 틀리거나 다른 부분이 있을 수 있습니다.
1. 컬렉션과 다른 Stream
JAVA에서 대표적인 컬렉션의 예로, List가 있다. List는 논리적인 순서가 있는 자료구조로, 중복을 허용한다는 특징이 있다. 해당 List를 구현체로는 ArrayList나 LinkedList 등이 있다. 이런 List를 사용하려면 반복을 해야 하는데, 보통 for-each 를 이용하여 List의 요소를 추출하여, 추가 연산을 하게 된다. 이처럼 컬렉션은 반복을 위해서는 외부 반복(external iteration)을 해야 하는데, 외부 반복을 할 수 있도록 for-each와 같은 반복자가 필요하다. 또한 컬렉션과 같은 자료구조는 해당 값의 전부를 메모리에 저장하여 실행한다.
반대로 stream 은 다음과 같다.
데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
- Modern in Java Action, p.141
stream은 반복자의 도움 없이도 반복이 가능하며, 내부 반복(internal iteration)을 사용한다. 외부 반복처럼 반복자를 이용하여 직접 데이터를 처리하며 병렬성을 처리하기 위한 방법을 사용해야 하지만, 내부 반복은 데이터를 자동으로 처리되며 병렬성을 자동으로 구현한다. (참고로, 스레드 병렬성 관련한 용어로, synchronized 나 reentrantlock 등이 있다. -> 영한쌤 고급 강의 1편 참고!)
2. Stream 기법
1) 필터링
정수기의 필터처럼, 무엇인가를 걸러낸다!로 생각하면 좋을 것 같다. 예를 들어 다음과 같이 표현될 수 있는데
.... = fruit.stream().filter(e -> apple.equals(e.getType())). ...
과일의 타입 중 사과와 동일한 타입의 데이터만 추출하게 된다.
2) 매핑
원하는 데이터를 선택하는 작업이다. 예를 들어 과일(Fruit)이라는 객체가 있는데, 여기서 apple banana 처럼 과일들의 이름의 데이터만 선택하고 싶을 수 있다.
... = fruit.stream().map(Fruit::getType)....
3) 리듀싱
책에서는 리듀싱을 다음과 같이 소개하고 있다
모든 스트림 요소를 처리해서 값으로 도출한...
- Modern in Java Action, p.170
java 1.8 문서를 참고하자면..
T reduce(T identity, BinaryOperator<T> accumulator)
Performs a reduction on the elements of this stream, using the provided identity value
and an associative accumulation function, and returns the reduced value.
identity처럼 초깃값을 설정할 수 있고, BinaryOperator처럼 2가지의 값을 가지고 연산을 만들어낼 수 있다.
... = fruit.stream().map(Fruit::getQuantity).reduce(0, (a,b) -> a+b);
//또는
... = fruit.stream().map(Fruit::getQuantity).reduce(0,Integer::sum);
을 활용할 수 있다.
References
1. Modern in Java Action [모던 자바 인 액션] - 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트 지음, 우정은 옮김, 한빛미디어
2. JAVA 1.8 API - Stream
Stream (Java Platform SE 8 )
A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())
docs.oracle.com
'Languages > JAVA' 카테고리의 다른 글
| [JAVA] 값 복사 vs 참조 복사 (0) | 2025.02.25 |
|---|---|
| [JAVA] Time (1) | 2025.02.20 |
| [JAVA] Optional (2) | 2024.09.08 |
| [JAVA] max() (0) | 2024.04.04 |
| [JAVA] 간단한 Predicate<T> (0) | 2024.03.31 |