백기선(인프런 강의)/더 자바, Java 8
Stream 소개
레알윙
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());
}
}
반응형