2. 스트림API의 소개
List<Dish> lowCaloricDishes = new ArrayList<>();
for (Dish d : menu) {
if (d.getCalories() < 400) {
lowCaloricDishes.add(d);
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
@Override
public int compare(Dish d1, Dish d2) {
return Integer.compare(d1.getCalories(), d2.getCalories());
}
});
List<String> lowCaloricDishesName = new ArrayList<>();
for (Dish d : lowCaloricDishes) {
lowCaloricDishesName.add(d.getName());
}
컬렉션을 다뤄야 할 일이 많지만..
3. 스트림API의 소개
SELECT name FROM dishes WHERE calorie < 400 ORDER BY calorie;
List<String> lowCaloricDishesName = menu.stream()
.filter(d -> d.getCalories() > 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
4. 함수형 스타일 코드는
변수의 명시적인 변경이나 재할당 문제를 피할 수 있다
서술적인 코드 작성이 가능하다
간결하다
직관적이다
명령형 -> 서술형
5. 스트림API의 특징은
List<String> lowCaloricDishesName = menu.parallelStream()
.filter(d -> d.getCalories() > 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
선언형
조립할 수 있음
병렬화
6. 스트림과 컬렉션
컬렉션 : 모든 값을 메모리에 저장하는 자료구조
스트림 : 요청할 때만 요소를 계산
예) 스트리밍 영화, 소수 계산
1) 딱 한 번만 탐색할 수 있다
List<String> title = Arrays.asList(...);
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println); //java.lang.IllegalStateException
LSA에서는 예외는 발생하지 않는다. 그러
나 다시 반복되지 않고 바로 연산이 끝나기
때문에 한 번만 탐색할 수 있는 것은 동일하
다
7. 스트림과 컬렉션
2) 외부 반복과 내부 반복
내부에서 병렬 처리가 가능해 지고
최적화된 순서로 처리할 수 있다