컬렉션 및 배열에 저장된 요소를 반복 처리하기 위해서는 for
문을 이용하거나 Iterator
(반복자)를 이용
Java 8 부터는 컬렉션 및 배열의 요소를 반복 처리하기 위해 스트림을 이용.(스트림은 요소들이 하나씩 흘러가면서 처리된다는 의미)
Stream<String> stream = list.stream();
stream.forEach( item -> );
→ List 컬렉션의 stream()
메서드로 Stream 객체를 얻고, forEach()
메서드로 요소를 어떻게 처리할지를 람다식으로 제공.
package stream.sec01;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;
public class StreamMain {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("홍길동");
set.add("신용권");
set.add("김자바");
Stream<String> stream = set.stream();
// 람다식 요소 처리 방법
stream.forEach(name -> System.out.println(name));
}
}
map(), filter(), sorted()
forEach(), collect(), count()
내부 반복자는 멀티 코어 CPU를 최대한 활용하기 위해 요소들을 분배시켜 병렬 작업을 할 수 있음. 하나씩 처리하는 순차적 외부 반복자보다는 효율적으로 요소를 반복시킬 수 있는 장점
package stream.sec02;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class ParallelStreamMain {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach(name ->{
System.out.println(name + " : " + Thread.currentThread().getName());
});
}
}
항목 | stream() |
parallelStream() |
---|---|---|
실행 방식 | 순차 처리 (단일 스레드) | 병렬 처리 (여러 스레드) |
스레드 수 | 기본적으로 main 스레드 하나만 사용 | ForkJoinPool의 여러 스레드 사용 |
처리 순서 | 순서를 보장함 | 순서 보장 안 됨 (속도 우선) |
CPU 사용 | 싱글 코어 | 멀티코어 활용 가능 |
사용 목적 | 단순 반복, 순서 중요할 때 | 속도 중요, 대량 데이터 처리 시 유리 |