[더 자바, Java 8] Stream


  • Stream

    Stream

    • sequence of elements supporting sequential and parallel aggregate operations

    • 데이터를 담고 있는 저장소 (컬렉션)이 아니다.

      • 컬렉션과 스트림은 엄연히 다르다.
    • Funtional in nature, 스트림이 처리하는 데이터 소스를 변경하지 않는다.

    • 스트림으로 처리하는 데이터는 오직 한번만 처리한다.

    • 무제한일 수도 있다. (Short Circuit 메소드를 사용해서 제한할 수 있다.)

    • 중개 오퍼레이션은 근본적으로 lazy 하다.

      • 중개형 오퍼레이터는 터미널 오퍼레이터가 오기전까지 실행을 안한다.
    • 손쉽게 병렬 처리할 수 있다.

      • parralStream을 사용하면 JVM 이 알아서 병렬처리 해준다.

      • List<String> parallelCollect = names.parallelStream().map((s)->{
        			System.out.println(s + " "+ Thread.currentThread().getName());
        			return s.toUpperCase();
        		}).collect(Collectors.toList());
        		parallelCollect.forEach(System.out::println);
        
      • 병렬처리라는게 매번 빨라지는게 아님 데이터의 양이 방대하다거나 쓰레드간의 Context Switching 비용이 더들면 오히려 느려질수도있다.

    스트림 파이프라인

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

    중개 오퍼레이션

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

    참고

    • https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

    • https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html



on Cs, Java, Stream