본문 바로가기
Language/Java

Java - 스트림(stream)

by 밍상 2022. 3. 3.

스트림은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다.

정확히는 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소라고 설명할 수 있다.

간단히는 스트림이 데이터 컬렉션 반복을 멋지게 처리하는 기능이라고 생각하자.

 

칼로리가 400이 안되는 음식들을 정렬하고 음식들의 이름만 가지는 리스트를 구하는 방법을 생각해보자.

 

스트림을 사용하기 전에는 for문을 돌면서 필터링한 리스트를 구한 뒤, 정렬을 하고, for문을 돌면서 새로운 리스트에 이름만 넣어주는 식으로 코드를 작성해야 한다. 

void filterAndSort(){
	List<Dish> lowCaloricDishes = new ArrayList<>(); 
	for(Dish dish: menu) {
		if(dish.getCalories() < 400) { 
        	lowCaloricDishes.add(dish);
		} 
    }
	Collections .sort(lowCaloricDishes, new Comparator<Dish>() {
    	public int compare(Dish dishl, Dish dish2) {
			return Integer.compare(dish1.getCalories(), dish2.getCalories());
        }
	 });
	List<String> lowCaloricDishesName = new ArrayList<>(); 
    for(Dish dish: lowCaloricDishes) {
		lowCaloricDishesName.add(dish.getName());
	}
}

하지만 스트림을 사용하면 아래와 같이 간단하게 바꿀 수 있다.

.filter를 사용해서 필터링, sorted를 사용해서 정렬, map을 사용해서 name만 추출하고 collect를 이용해서 리스트로 반환할 수 있다.

void filterAndSort(){
	List<String> lowCaloricDishesName =
    	menu.stream()
    		.filter(d -> d.getCalories() < 400) 
    		.sorted(comparing(Dish::getCalories)) 
    		.map(Dish::getName)  
    		.collect(toListO);
}

 

자바 8 스트림 API의 특징을 다음처럼 요약할 수 있다.

  • 선언형: 더 간결하고 가독성이 좋아진다.
  • 조립할 수 있음: 유연성이 좋아진다.
  • 병렬화: 성능이 좋아진다.

중간 연산

연산 형식 반환 형식 연산의 인수 함수 디스크립터
filter 중간 연산 Stream<T> Predicate<T> T -> boolean
map 중간 연산 Stream<R> Function<T, R> T -> R
limit 중간 연산 Stream<T>    
sorted 중간 연산 Stream<T> Comparator<T> (T, T) -> int
distinct 중간 연산 Stream<T>    

최종 연산

연산 형식 반환 형식 목적
forEach 최종 연산 void 스트림의 각 요소를 소비하면서 람다를 적용한다.
count 최종 연산 long 스트림의 요소 개수를 반환한다.
collect 최종 연산   스트림을 리듀스해서 리스트, 맵, 정수 형식의 컬렉션을 만든다.

'Language > Java' 카테고리의 다른 글

Java - 스트림으로 데이터 수집  (0) 2022.03.03
Java - 스트림 활용  (0) 2022.03.03
Java - 테스트  (0) 2022.01.28
Java - 문자열 2  (0) 2022.01.24
Java - static, final이란?  (0) 2021.10.19