티스토리 뷰

Java/Java8

스트림과 병렬 처리

Xion 2021. 5. 29. 14:16

스트림

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

→ Stream이 제공아는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개 타입을 가지기 때문에 람다식 또는 메소드 참조를 이용해서 요소 처리 내용을 매개값으로 전달할 수 있다.

 

stream 사용

List<String> list = Arrays.asList("홍길동","김자바","덕덕"); Stream<String> stream = list.stream(); stream.forEach( name -> System.out.println(name));

 

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

  • 내부 반복자 : 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야 할 코드만 제공하는 코드 패턴.
  • 외부 반복자(external iterator) : 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴을 말한다. (index를 사용하는 for문 그리고 Iterator를 사용하는 while문 )

내부 반복자를 통해 얻는 이점 → 개발자는 요소 처리 코드에만 집중할 수 있다.멀티코어 CPU를 최대한 활요하기 위해 요소들을 분배시켜 병렬 작업을 할 수 있게 도와준다.

 

병렬 처리란?

  • 한 가지 작업을 서브로 나누고 서브 작업들을 분리된 스레드에서 병렬적으로 처리하는 것을 말한다.
  • 런타임 시 하나의 작업을 서브 작업으로 자동으로 나누고, 서브 작업의 결과를 자동으로 결합해서 최종 결과물 생성한다.

 

스트림은 중간 처리와 최종 처리를 할 수 있다.

  • 스트림은 컬렉션의 요소에 대해 중간 처리와 최종 처리를 수행할 수 있는데 중간 처리에서는 매핑,필터링, 정렬을 수행하고 최종 처리에서는 반복,카운팅,평균,총합 등의 집계 처리를 수행한다.

 

스트림의 종류

자바8 부터 새로 추가된 java.util.stream 패키지에는 스트림(stream) API들이 포진하고 있다.

패키지 내용을 보면 BaseStream 인터페이스를 부모돌 해서 자식 인터페이스들이 다음과 같은 상속 관계를 이루고 있다.

 

BaseStream - 1. Stream

- 2.IntStream

- 3.LongStream

- 4.DoubleStream

 

 

 

 

BaseStream 인터페이스에는 모든 스트림에서 사용할 수 있는 공통 메서드들이 정의되어 있을 뿐 코드에서 직접적으로 사용되진 않는다.

Stream : 객체 요소를 처리하는 스트림

나머지 :해당 형으로 처리하는 요소이다.

 

컬렉션으로부터 스트림 얻기

List<Student> list = Arrays.asList(new Student("a",1) 																		,new Student("b",2) ); Stream<Student> stream =list.stream(); stream.forEach( student -> System.out.printl(student) ); 

배열로부터 스트림 얻기 ( Arrays 활용 )

//문자열일 경우 String[] arr = {"a","b","c"}; Streaem<String> stream = Arrays.stream(arr); stream.forEach( arr -> System.out.print(arr) );  //int형일 경우 Int[] intArr = ; IntStream intStream = Arrays.stream(intArr); intStream.forEach(arr -> System.out.print(arr));

숫자 범위로부터 스트림 얻기 ( rangeClosed()활용 )

// 1~100 까지의 합을 얻는 IntStream IntStream stream = IntStream.rangeClosed(1,100); stream.forEach( sum -> System.out.print(sum));

 

스트림 파이프 라인

  • 대량의 데이터를 가공해서 축소하는 것을 일반적으로 리덕션(Reduction)이라고 한다.
  • 데이터의 합계, 평균값, 카운팅, 최대값, 최소값 등이 대표적인 결과물이라고 볼 수 있다.
  • 그러나, 컬렉션의 요소를 리덕션의 결과물로 바로 집계할 수 없을 경우에는 집계하기 좋도록 필터링, 매핑, 정렬, 그룹핑 등의 중간 처리가 필요하다.
  • 스트림 파이프 라인에서 최종 처리를 제외하고는 모두 중간 처리 스트림이다.스트림소스 → 오리지날 스트림 → 필터링 처리 중간 스트림 → 매핑 처리 중간 스트림 → 집계 처리 결과물

(컬렉션,배열,파일) |——- ( 중 간 처 리) -—-| —-최종 처리 —

 

중간처리 메소드와 최종처리 메소드

 

→ 중간 처리 메소드와 최종 처리 메소드를 쉽게 구분하는 방법은 리턴 타입을 보면 된다.

리턴 타입이 Stream 이면, 중간 처리 메소드

리턴 타입이 기본타입이거나, OptionalXXX 이라면 최종 처리 메소드이다.