Java Stream 관련 정리 from 이것이 자바다(책)

Updated:

Stream

Stream : 자바 8부터 추가된 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자

  1. 내부 반복자를 사용하므로 병렬 처리가 쉽다

스트림내부반복자

스트림내부반복자2

내부 반복자들은 멀티 코어 CPU를 활용하기 위해 요소들을 분배시켜 병렬 작업을 할 수있게 도와준다는 특징이 있다.

  1. 중간 처리와 최종 처리 작업을 수행한다

중간처리최종처리

위의 그림처럼 중간처리에서 학생의 개별점수를 뽑아내고, 또다른 어떤 작업을 처리한 후 최종 처리를 할수도 있다

  1. 람다식으로 요소 처리 코드를 제공한다 → 람다식 or 메소드 참조를 이용해 요소 처리 내용을 매개값으로 전달이 가능함
List<Integer> list = Arrays.asList(1,2,3,4,5,6);
Stream<Integer> stream = list.stream();
stream.forEach(s->System.out.println(s)); // 매개값인 s로 가능함
  1. 그리고 스트림은 중간 처리와 최종 처리를 파이프라인으로 해결한다. 파이프라인은 여러 개의 스트림이 연결되어 있는 구조를 말한다

중간처리최종예제

그리고 이것을 코드로 표현을 해보면 이렇게 표현이 된다

double ageAvg = list.stream() // 오리지널 스트림
				.filter(m->m.getSex() == Member.MALE) //중간처리
				.mapToInt(Member::getAge) // 중간처리
			    .average() //최종처리
				.getAsDouble();

이처럼 스트림은 다음과 같은 4가지의 특징을 지니고 있다. 다음은 주로 쓰이는 메소드들에 대해서 살펴보도록 하겠다.

Stream Method

우선은 기본적으로 주로 쓰이는 메소드들을 써보았다. Stream의 collect()메소드는 경우도 많고, 내용도 어려우니, 우선은 다음번에 따로 제대로 이해해서 작성을 하도록 하겠습니다.

map과 flatMap메소드의 차이점은 map의 경우는 타입 파라미터로 주어진 요소들을 하나씩 그대로 일대일로 매핑하여 그 결과를 하나의 스트림으로 리턴을 하는것이고, 반면에 flatMap 같은 경우는 주어진 요소들을 하나씩 Stream 타입으로 전환이 되는 것이다. 그리고 그것들을 합쳐서 최종적으로 하나의 스트림으로 리턴을 하는것</span>이다.

그래서 결과적으로는 차이가 안날수도 있다. 그러나 flatMap의 경우는 n차원배열을 처리할때 상당히 효과적일수 있다.

String[][] data = new String[][]{ {"1", "2"}, {"3", "4"} };

Stream<Stream<String>> map = Arrays.stream(data).map(x -> Arrays.stream(x));
map.forEach(s -> s.forEach(System.out::println));

Stream<String> flatmap = Arrays.stream(data).flatMap(x -> Arrays.stream(x));
flatmap.forEach(System.out::println);

collecct()메소드는 스트림의 최종처리 메소드로서, 필요한 요소만 컬렉션으로 담거나, 요소들을 그룹핑을 해서 집계(reduction)을 할수 있는 기능을 제공한다.

기본적으로 대표적인 메소드를 써보면

Stream collect

그리고 마지막으로 병렬처리를 하는데 도움을 주는 메소드들이 존재한다.

Stream Parallel

위처럼 병렬처리 메소드를 실행을 할 경우에는, 각자 개발 환경에 맞는 코어CPU에 맞게 요소를 나누어서, 각각의 나누어진 요소들을 분리된 스레드에서 병렬처리를 한다. 예를 들면, 듀얼 코어(Dual Core)의 경우 2개의 요소들로 나누어져, 2개의 스레드가 병렬처리를 한다고 생각하면된다.

위와 관련한 모든 예제들은 아래 링크 주소에 있으니 참고해주시면 감사하겠습니다.
https://github.com/goodgood619/ThisIsJava

Leave a comment