1. 람다식으로 요소 처리 코드를 제공한다.
Stream이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개 타입을 가지기 때문에 람다식 또는 메소드 참조를 이용해서 요소 처리 내용을 매개값으로 전달할 수 있다.
요소 처리를 위한 람다식
package sec01.stream_introduction_YJ;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class LambdaExpressionExample {
public static void main(String[] args) {
List<Student> list = Arrays.asList(
new Student("홍길동", 90),
new Student("신용권", 92)
);
Stream<Student> stream = list.stream(); //스트림 얻기
stream.forEach( s -> { //List 컬렉션에서 Student를 가져와 람다식 매개값으로 제공
String name = s.getName();
int score = s.getScore();
System.out.println(name + "-" + score);
});
}
}
학생 클래스
package sec01.stream_introduction_YJ;
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
홍길동-90
신용권-92
2. 내부 반복자를 사용하므로 병렬 처리가 쉽다.
내부 반복자
: 컬렉션 내부에서 요소들을 반복, 개발자는 요소당 처리해야 할 코드만 제공
Iterator는 컬렉션의 요소를 가져오는 것에서부터 처리하는 것까지 모두 개발자가 작성해야 하지만, 스트림은 람다식으로 요소 처리 내용만 전달할 뿐, 반복은 컬렉션 내부에서 일어난다.
병렬 처리
: 한 가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리하는 것
: 여러 개의 스레드가 요소들을 부분적으로 합하고 이 부분합을 최종 결합해서 전체 합을 생성
병렬 처리
package sec01.stream_introduction_YJ;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class ParallelExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("홍길동", "신용권", "감자바", "람다식", "박병렬");
//순차처리
Stream<String> stream = list.stream();
stream.forEach( ParallelExample :: print ); //메소드 참조 : s -> ParellelExample.print(s)와 동일
System.out.println();
//병렬 처리
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach( ParallelExample :: print ); //메소드 참조 : s -> ParellelExample.print(s)와 동일
}
public static void print(String str) {
System.out.println(str + " : " + Thread.currentThread().getName());
}
}
홍길동 : main
신용권 : main
감자바 : main
람다식 : main
박병렬 : main
감자바 : main
람다식 : ForkJoinPool.commonPool-worker-2
박병렬 : main
신용권 : ForkJoinPool.commonPool-worker-1
홍길동 : ForkJoinPool.commonPool-worker-3
3. 스트림은 중간 처리와 최종 처리를 할 수 있다.
중간 처리
: 매핑, 필터링, 정렬 수행
최종 처리
: 반복, 카운팅, 평균, 총합 등의 집계 처리
중간 처리와 최종 처리
package sec01.stream_introduction_YJ;
import java.util.Arrays;
import java.util.List;
public class MapAndReduceExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(
new Student("홍길동", 10),
new Student("신용권", 20),
new Student("유미선", 30)
);
double avg = studentList.stream()
//중간 처리(학생 객체를 점수로 매핑)
.mapToInt(Student :: getScore)
//최종 처리 (평균 점수)
.average()
.getAsDouble();
System.out.println("평균 점수: " + avg);
}
}
평균 점수: 20.0
'Java > 16. 스트림과 병렬 처리' 카테고리의 다른 글
Day 21 : 매핑 (flatMapXXX(), mapXXX(), asXXXStream(), boxed()) (0) | 2021.11.16 |
---|---|
Day 21 : 필터링 (distinct(), filter()) (0) | 2021.11.16 |
Day 21 : 스트림 파이프라인 (0) | 2021.11.16 |
Day 21 : 스트림의 종류 (0) | 2021.11.16 |
Day 21 : 반복자 스트림 (0) | 2021.11.16 |