-
Stream 소개백기선(인프런 강의)/더 자바, Java 8 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, ...
참고
- 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
코드 예시
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()); } }
반응형'백기선(인프런 강의) > 더 자바, Java 8' 카테고리의 다른 글
Optional 소개 (0) 2020.07.11 Stream API (0) 2020.07.11 자바 8 API의 기본 메소드와 스태틱 메소드 (0) 2020.07.09 인터페이스 기본 메소드와 스태틱 메소드 (0) 2020.07.08 메소드 래퍼런스 (0) 2020.07.07