JAVA Stream
: 데이터를 담고 있는 저장소가 아닌 데이터를 처리하는 과정
데이터를 오직 한번씩 처리한다.
병렬처리게 가능하며 중간 단계를 Lazy하게 처리한다.
Collection 객체의 Stream 메서드를 통해 생성이 가능하다.
중계 오퍼레이션
- 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.function.Consumer;
import java.util.stream.Collectors;
public class main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("ab");
list.add("cd");
list.add("ef");
list.stream().map((x)->x+"1"); // not operate
List<String> list2 = list.stream().map((x)->x+"1").collect(Collectors.toList()); //make operate
list2.forEach(System.out::println);
}
}
위의 예시의 경우 중계 오퍼레이션 map 만존재하는 경우 스트림은 동작하지 않으며 아무런 결과를 만들 수 없다.
그러나 종료 오퍼레이션인 Collection을 통해 리스트로 객체를 반환하면 map에 해당하는 동작을 수행 후 결과를 반환 받는다.
병렬 처리
이렇게 만들어지는 Stream은 병렬처리가 가능한데 병렬처리를 하게 되면 스트림이 동작하는 각각의 행위들은 다른 쓰레드(자식 쓰레드)하에서 동작하게 된다.
public class main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("az3");
list.add("bx44");
list.add("cy55");
list.stream()
.map(x->Thread.currentThread().toString())
.forEach(System.out::println);
}
}
위와 같이 기본적인 스트림으로 동작하게 되면 아래와 같이 같은 쓰레드의 이름이 출력된다.
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
public class main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("az3");
list.add("bx44");
list.add("cy55");
list.parallelStream()
.map(x->Thread.currentThread().toString())
.forEach(System.out::println);
}
}
결과:
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[ForkJoinPool.commonPool-worker-2,5,main]
위와 같이 Parallelstream으로 스트림을 생성하면 다른 쓰레드의 이름이 출력된다.
'Programing Language > JAVA' 카테고리의 다른 글
AutoBoxing vs UnBoxing (0) | 2021.02.21 |
---|---|
Platform Independent Language (0) | 2021.02.21 |
Effective Final과 lambda expression의 Scope (0) | 2020.08.16 |
JAVA 기본 함수형 인터페이스 정리 (0) | 2020.08.16 |
함수형 인터페이스와 람다 표현식 (0) | 2020.08.11 |