본문 바로가기

책리뷰/모던자바인액션

자바 스트림 처리

728x90
반응형

스트림이란?

한 번에 한개씩 만들어지는 연속적인 데이터 항목들의 모임.

입력스트림에서 데이터를 한 개씩 읽어들어 출력스트림으로 데이터를 한 개씩 기록한다.

어떤 프로그램의 출력 스트림은 다른 프로그램의 입력스트림이 될 수 있다.

 

예를 들어, 자동차 생산 공장 라인은 여러 자동차로 구성된 스트림을 처리하는데,

각각의 작업장에서 자동차를 받아서 수리한 후 다른 작업장이 처리할 수 있도록 넘겨준다.

즉, 조립라인은 자동차를 물리적인 순서로 한 개씩 운반하지만 각각의 작업장에서는 동시에 작업을 처리한다. 

 

자바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으로 문제를 해결할 수 있다. 

 

728x90
반응형