스트림이란?
한 번에 한개씩 만들어지는 연속적인 데이터 항목들의 모임.
입력스트림에서 데이터를 한 개씩 읽어들어 출력스트림으로 데이터를 한 개씩 기록한다.
어떤 프로그램의 출력 스트림은 다른 프로그램의 입력스트림이 될 수 있다.
예를 들어, 자동차 생산 공장 라인은 여러 자동차로 구성된 스트림을 처리하는데,
각각의 작업장에서 자동차를 받아서 수리한 후 다른 작업장이 처리할 수 있도록 넘겨준다.
즉, 조립라인은 자동차를 물리적인 순서로 한 개씩 운반하지만 각각의 작업장에서는 동시에 작업을 처리한다.
자바8에서 java.util.stream패키지에 스트림API가 추가되었다.
스트림API는 조립라인처럼 어떤항목을 연속으로 제공하는 어떤 기능이라고 생각한다.
스트림은 스트림 내의 요소를 쉽게 병렬로 처리할 수 있는 환경을 제공한다.
컬렉션을 필터링할 수 있는 가장 빠른 방법은 컬렉션을 스트림으로 바꾸고,
병렬로 처리한 다음 리스트로 다시 복원하는 것이다.
스트림을 이용하면 데이터를 처리하는 임시 구현 코드 대신 질의로 컬렉션 데이터를 처리할 수 있다.
멀티스레드 코드 없이 병렬로 처리가 가능하다.
filter, sorted, map, collect같은 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다.
스트림 API 특징
선언형 : 간결하고 가독성이 좋아진다.
조립형 : 유연성이 좋아진다.
병렬화 : 성능이 좋아진다.
스트림 매핑
매핑이란 특정 객체에서 특정 데이터를 선택하는 작업으로 데이터 처리과정에서 자주 수행되는 연산이다.
스트림 API는 map과 flapMap 메서드를 제공한다.
List<String> dishNames = menu.stream().map(Dish::getName).collect(toList());
getName은 문자열을 반환하기 때문에 map 메서드의 출력스트림은 Stream<String> 형식을 갖는다.
만약 단어리스트가 주어졌을 때 단어가 포함하는 글자의 수를 반환해야할 경우 map을 이용할 수 있다.
List<String> words = Arrays.asList("Modern","java", In","Action");
List<Integer> worldLengths = words.strea().map(String::length).collect(toList());
각 요소에 함수를 적용할 수 있다.
요리명의 길이를 알고 싶다면 아래와 같이할 수 있다.
List<Integer> dishNameLengths = menu.stream()
.map(Dish::getName)
.map(String::length)
.collect(toList());
스트림 평면화
리스트에서 고유문자로 이루어진 리스트를 반환할 경우
["Hello","World"]는 ["H","e","l","o","W","r","d"]를 포함하는 리스트가 반환되어야 한다.
distinct를 이용해서 중복된 문자를 필터링 해 문제를 해결할 수 있다.
하지만 위 map에서 반환한 람다는 String[]을 반환하는 것이 문제다.
flatMap으로 문제를 해결할 수 있다.
'책리뷰 > 모던자바인액션' 카테고리의 다른 글
모던자바인액션 12강 Date, Calendar 날짜와 시간 API (0) | 2022.01.25 |
---|---|
모던자바인액션 11강 Optional (0) | 2022.01.24 |
컬렉션 API 개선 (0) | 2022.01.10 |
JAVA 병렬 스트림 사용시 고려할 점 (0) | 2022.01.08 |
람다란 무엇인가 (0) | 2022.01.03 |