레알윙 2020. 7. 9. 20:52
반응형

Stream

  • sequence of elements supporting sequential and parallel aggregate operations
  • 데이터를 담고 있는 저장소 (컬렉션)이 아니다.
  • Funtional in nature, 스트림이 처리하는 데이터 소스를 변경하지 않는다.
  • 스트림으로 처리하는 데이터는 오직 한번만 처리한다.
  • 무제한일 수도 있다. (Short Circuit 메소드를 사용해서 제한할 수 있다.)
  • 중개 오퍼레이션은 근본적으로 lazy 하다.
  • 손쉽게 병렬 처리할 수 있다.

parallelStream

병렬을 쳐리해주는 스트림이지만 성능이 무조건 좋은건 아니다. 그 이유는 병렬을 처리하기위해서 쓰레드를 생성해야되는 비용이 필요하기 때문이다. 사용할 때는 데이터가 매우 방대하게 많을 때 사용하면 좋다.

 

스트림 파이프라인

  • 0 또는 다수의 중개 오퍼레이션 (intermediate operation)과 한개의 종료 오퍼레이션 (terminal operation)으로 구성한다.
  • 스트림의 데이터 소스는 오직 터미널 오퍼네이션을 실행할 때에만 처리한다.

 

중개 오퍼레이션

  • Stream을 리턴한다.
  • Stateless / Stateful 오퍼레이션으로 더 상세하게 구분할 수도 있다. (대부분은 Stateless지만 distinct나 sorted 처럼 이전 이전 소스 데이터를 참조해야 하는 오퍼레이션은 Stateful 오퍼레이션이다.)
  • Filter, map, limit, skip, sorted, ...

 

종료 오퍼레이션

  • Stream을 리턴하지 않는다.
  • collect, allMatch, count, forEach, min, max, ...

 

참고

 

 

코드 예시

import java.util.ArrayList;
import java.util.List;
import java.util.Spliterator;
import java.util.stream.Collectors;

import ch.qos.logback.core.net.SyslogOutputStream;

public class App {

	public static void main(String[] args) {
		List<String> names = new ArrayList<String>();
		names.add("JinSeok");
		names.add("JinSeok1");
		names.add("JinSeok2");
		names.add("JinSeok3");
		names.add("JinSeok4");
		names.add("test");

		// 중계형 오퍼레이터만 사용할 경우 실행이 되지 않는다.
		names.stream().map((s) -> {
			System.out.println(s);
			return s.toUpperCase();
		});

		System.out.println();
		System.out.println("=========================");
		System.out.println();

		names.stream().map((s) -> {
			System.out.println(s);
			return s.toUpperCase();
		}).collect(Collectors.toList());

		System.out.println();
		System.out.println("=========================");
		System.out.println();

		List<String> collect = names.stream().map((s) -> {
			System.out.println(s + "  " + Thread.currentThread().getName());
			return s.toUpperCase();
		}).collect(Collectors.toList());
		
		System.out.println();
		System.out.println("=========================");
		System.out.println();

		
		List<String> collect2 = names.parallelStream().map((s) -> {
			System.out.println(s + "  " + Thread.currentThread().getName());
			return s.toUpperCase();
		}).collect(Collectors.toList());
	}
}
반응형