
스트림
EX) 저칼로리의 요리명을 반환 후 칼로리를 기준으로 요리를 정렬
자바 7 코드
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 dish1, Dish dish2){
return Integer.compare(dish1.getCalories(), dish2.getCalories());
}});
List<String> lowCaloricDishesName = new ArrayList<>();
for(Dish dish: lowCaloricDishes){
lowCaloricDishesName.add(dish.getName());
}
List<String> lowCaloricDishesName = menu.stream()
.filter(d -> d.getCalories() <400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList()); //모든 요리명을 리스트에 저장
List<String> lowCaloricDishesName = menu.parallelStream()
.filter( d -> d.getCalories() < 400)
.sorted(comparing(Dishes::getCalories))
.map(Dish::getName)
.collect(toList());
스트림 이득의 기능
고수준 빌딩 블록
→ 데이터 처리 과정을 병렬화 하면 스레드와 락 걱정 필요 X
자바 8의 스트림 API 특징
스트림이란
예제
List<String threeHighCaloricDishNames =
menu.stream() //메뉴에서 스트림 얻기
.filter(dish -> dish.getCalories() > 300)
.map(Dish::getName)
.limit(3)
.collect(toList());
데이터 소스는 메뉴 → 데이터 소시 연속된 요소 를 스트림에 제공 → 데이터 처리 연산 적용 → collect를 제외한 모든 연산은 서로 파이프라인 형성 할 수 있도록 스트림 반환
컬렉션 , 스트림 차이
스트림
외부반복
내부반복
//컬렉션: for-each 루프를 이용하는 외부반복
List<String> names = new ArrayList<>();
for(Dish dish:menu){
names.add(dish.getName());
}
//스트림: 내부 반복
List<String> names = menu.stream()
.map(Dish::getName)
.collect(toList()); //파이프라인 실행함, 반복자 필요X
컬렉션
내부 반복이 좋은 다른 두가지 이유
스트림 라이브러리 내부반복
List<String highCaloricDishes = menu.stream()
.filter(dish -> dish.getCalories() > 300)
.map(Dish::getName)
.collect(toList());
List<String threeHighCaloricDishNames =
menu.stream() //메뉴에서 스트림 얻기
.filter(dish -> dish.getCalories() > 300)
.map(Dish::getName)
.limit(3)
.collect(toList());
연결할 수 있는 스트림 연산
→ 중간 연산
스트림을 닫는 연산
→ 최종 연산
특징
최종연산
스트림 이용과정
스트림 파이프라인의 개념 == 빌더 패턴과 비슷