리루

Steam 본문

# Study/JAVA

Steam

뚱보리루 2020. 7. 5. 11:06

Stream

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

 - Sequence of elements supporting sequential and parallel aggregate operations.

 - 연속된 데이터를 처리하는 Operation의 모임

 - 데이터를 담는 저장소가 아니라 데이터를 소스로 사용해서 어떠한 처리를 하는 것

 - Functional in nature : Stream으로 전달받은 데이터 다체를 변경하는게 아니라 또다른 Stream을 반환한다.

 - 들어오는 데이터가 무제한일 수 있다.

 - 들어오는 데이터가 무제한일 때 Short Circuit 메소드를 사용해 제한할 수 있다.

 - Stream 이 제공하는 Operation은 계속해서 이어지는 중계형 Operation(Stream을 반환)과 종료 Operation(Stream이 아닌 다른 형태를 반환)으로 나눌 수 있다. (forEach도 stream 반환이 아니라 종료 Operation이다)

 - Stream 데이터 소스는 오직 터미널 오퍼네이션을 실행할 때에만 처리한다. (중계형 Operation들은 Lazy하게 동작한다.)

package com.example.demok;

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

public class RunSomething {

    public static void main(String[] args) {

    }

    public void run(){

        List<String> alphabet = new ArrayList<>();
        alphabet.add("a");
        alphabet.add("b");
        alphabet.add("c");
        alphabet.add("d");
        alphabet.add("e");

        // Do nothing because of no terminate operation
        alphabet.stream().map( s -> {
            System.out.println(s);
            return s.toUpperCase();
        });

        // Return a list
        List<String> upperCases = alphabet.stream().map( s -> {
            System.out.println(s);
            return s.toUpperCase();
        }).collect(Collectors.toList());

    }
}

 

pallarel stream

 - ForkJoinPool 을 이용해 여러개의 Thread를 사용해 병렬로 동작한다.

 - 무조건 paralleaStream을 사용한다고 빠른 것은 아니다.(Context Switch에 시간이 더 걸리는 케이스가 있을 것.)

    @Test
    public void streamTest(){
        List<String> alphabet = new ArrayList<>();
        alphabet.add("a");
        alphabet.add("b");
        alphabet.add("c");
        alphabet.add("d");
        alphabet.add("e");

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

        /*
        c, main
        a, ForkJoinPool.commonPool-worker-3
        e, ForkJoinPool.commonPool-worker-2
        b, ForkJoinPool.commonPool-worker-1
        d, ForkJoinPool.commonPool-worker-4
         */
    }

'# Study > JAVA' 카테고리의 다른 글

Java8 - Optional  (0) 2020.07.05
Java8 함수형 인터페이스  (0) 2020.07.04
[퍼온글]Volatile 변수  (0) 2017.03.31
[퍼온글]Servlet이란?  (0) 2017.03.31