[Stream 병렬처리] 스트림 소개 및 병렬처리
- 카테고리 없음
- 2019. 9. 15. 13:56
스트림
- 자바8부터 추가된 컬렉션의 저장요소를 하나씩 참조해서 람다식(functional style)으로 처리할 수 있도록 해주는 반복자
- 자바7까지는 Iterator를 이용해서 컬렉션에서 요소를 순차탐색하였음. -> 개발자가 순차탐색 코드 다씀.
- 스트림은 메소드 체이닝을 이용해서 여러가지 처리를 1줄의 코드로도 끝낼 수 있음.
스트림 특징
람다식으로 요소 처리 코드 제공
Stream<Student> stream = list.stream();
stream.forEach( s -> {
String name = s.getName();
int score = s.getScore();
System.out.println(name+"-"+score);
});
내부 반복자 사용으로 병렬처리에 용이
- 외부 반복자 : 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴. for문, iterator while문 같은 패턴
- 내부 반복자 : 컬렉션 내부에서 요소들을 반복시킴, 개발자는 요소당 처리해야할 코드만 제공하는 코드패턴.
-> 이점 : 개발자가 요소 반복시키는 것에는 관심을 끄고 요소 처리코드에만 집중할 수 있다.
- 병렬처리 : 한가지 작업을 서브 작업으로 나누고, 서브작업들을 분리된 스레드에서 병렬적으로 처리하는 것!
예제 : 순차처리 스트림 / 병렬처리 스트림 비교
public class ParallelExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("홍길동","신용권","뷰티풀","김거거","누누누");
long start = 0, end = 0; //속도 비교를 위해
//순차처리
start = System.currentTimeMillis();
Stream<String> stream = list.stream();
stream.forEach(ParallelExample::print);
end = System.currentTimeMillis();
System.out.println(end-start); //56~ 61 정도 나옴.
//병렬처리
start = System.currentTimeMillis();
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach(ParallelExample::print);
end = System.currentTimeMillis();
System.out.println(end-start); //5~6 정도 나옴
}
public static void print(String str) {
System.out.println(str+ " : "+Thread.currentThread().getName());
}
}
- 결과를 보면 병렬처리 스트림이 월등히 빠른 성능을 볼 수 있음.(한개할때 두개하니까)
스트림은 중간처리와 최종처리를 할 수 있다.
- 중간처리에서는 매핑, 필터링, 정렬을 수행하고 최종처리에서는 반복, 카운팅, 평균, 총합 등의 집계처리를 수행할 수 있다.
예제 : 학생들의 점수 평균
public class MapAndReduceExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(
new Student("뷰티풀",10),
new Student("신용권",5),
new Student("하하하",30),
new Student("케케케",24)
);
double avg = studentList.stream()
//중간처리(학생 객체를 점수로 매핑
.mapToInt(s -> s.getScore())
//최종 처리(평균 점수)
.average().getAsDouble();
System.out.println("평균 점수 : "+avg);
}
}
- 한줄로 끝낼 수 있다.