ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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, ...

     

    참고

     

     

    코드 예시

    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());
    	}
    }
    반응형
Designed by Tistory.