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

+ Recent posts