Programing Language/JAVA

JAVA Stream API -1 (기본 사용법)

칼쵸쵸 2021. 1. 21. 22:01

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으로 스트림을 생성하면 다른 쓰레드의 이름이 출력된다.