스트림이란?
- 스트림은 반복자이다.
- 컬렉션 또는 배열의 요소를 하나씩 참조하여 람다식으로 처리할 수 있는 반복자이다.
- Java7 이전까지는 외부반복자인 Iterator 를 사용했지만, Java8 이후부터는 내부반복자인 Stream 을 사용할 수 있다.
public class IteratorVsStreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("이진웅","김동현","양희정","조영찬");
// Iterator 이용
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
// Stream 이용
Stream<String> stream = list.stream();
stream.forEach(s->System.out.println(s));
}
}
스트림 특징
- 람다식으로 요소처리 코드를 제공한다.
- 스트림이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개타입을 가진다.
- 매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.
public class LambdaExpressionsExample {
public static void main(String[] args) {
List<Student> list = Arrays.asList(
new Student("이진웅", 90),
new Student("김동현", 91)
);
Stream<Student> stream = list.stream();
stream.forEach(s->{
String name = s.getName();
int score = s.getScore();
System.out.println(name + "-" + score);
});
}
}
스트림 장점
- 내부 반복자를 사용하므로 병렬 처리가 쉽다.
* 외부 반복자 : 개발자가 코드로 직접 컬렉션 요소를 반복해서 요청하고 가져오는 코드 패턴 (e.g. Iterator)
* 내부 반복자 : 컬렉션 내부에서 요소들을 반복시키고 개발자는 요소당 처리해야할 코드만 제공하는 코드 패턴
내부 반복자의 이점
- 개발자는 요소 처리 코드에만 집중
- 멀티 코어 CPU 를 최대한 활용하기 위해 요소들을 분배시켜 병렬 처리 작업을 할 수 있다.
- 외부 반복자 (e.g. Iterator) 를 사용하면서 병렬 처리를 하기 위해서는 Thread 처리 로직을 별도 구현해야한다.
스트림의 병렬 처리 방법
- 한가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리한 후, 서브 작업들의 결과들을 최종 결합하는 방법
- 자바는 ForkJoingPool 프레임워크를 이용해서 병렬 처리를 한다.
- 개발자가 Thread 처리 로직을 개발할 필요가 없다.

public class ParallelExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("이진웅","조영찬","김동현","유민규","양희정");
// 순차처리
Stream<String> stream = list.stream();
// stream.forEach(s->print(s)); // 람다표현식 방식
stream.forEach(ParallelExample::print); // 메소드 참조 방식
System.out.println();
// 병렬처리
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach(ParallelExample::print);
}
public static void print(String str) {
System.out.println(str + ":" + Thread.currentThread().getName());
}
}
console 출력결과
이진웅:main
조영찬:main
김동현:main
유민규:main
양희정:main
김동현:main
양희정:ForkJoinPool.commonPool-worker-3
이진웅:ForkJoinPool.commonPool-worker-3
조영찬:ForkJoinPool.commonPool-worker-5
유민규:ForkJoinPool.commonPool-worker-7
스트림은 중간 처리와 최종 처리를 할 수 있다.
- 중간처리 : 요소들의 매핑, 필터링, 정렬
- 최종처리 : 반복, 카운트, 평균, 총합

public class MapAndReduceExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(
new Student("이진웅", 90),
new Student("김동현", 80),
new Student("조영찬", 100)
);
double avg = studentList.stream()
.mapToInt(s->s.getScore())
.average()
.getAsDouble();
System.out.println(avg);
}
}'Back-end' 카테고리의 다른 글
| Oracle SQL을 MySQL로 전환하기 (0) | 2024.05.21 |
|---|---|
| Snowflake ID Generator (0) | 2023.04.16 |
| Javascript 에서 9천조 이상의 숫자를 다룰때 고민할 부분 (0) | 2023.04.13 |
| Java 메모장 (0) | 2021.05.16 |
| JAVA... (0) | 2021.04.21 |
댓글