[Stream 병렬처리] 스트림 소개 및 병렬처리

스트림

- 자바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);
	}
}

- 한줄로 끝낼 수 있다.

댓글

Designed by JB FACTORY