참고
스트림 활용
NOTE
스트림 API가 지원하는 다양한 연산을 살펴보자!
굉장히 많은 연산을 지원한다!
필터링( filter, distinct )
NOTE
스트림 API가 지원하는 다양한 연산을 살펴보자!
numbers.stream()
.filter(i -> i % 2 == 0) // 조건에 맞는 숫자만 필터링
.distinct() // 중복제거
.forEach(System.out::println);
Java
복사
스트림 슬라이싱( takeWhile, dropWhile, limit, skip )
NOTE
Dish.menu.stream()
.takeWhile(dish -> dish.getCalories() < 320)
.forEach(System.out::println);
Java
복사
takeWhile → 조건이 참이 아닌경우 지금까지의 리스트를 반환한다.
Dish.menu.stream()
.dropWhile(dish -> dish.getCalories() < 320)
.forEach(System.out::println);
Java
복사
dropWhile → 조건이 참이 아닌경우 지금까지의 리스트를 버리고 남은걸 반환한다.
Dish.menu.stream()
.filter(dish -> dish.getCalories() < 320)
.limit(3)
.forEach(System.out::println);
Java
복사
limit → 주어진 값 이하의 크기를 갖는 스트림을 반환한다.
Dish.menu.stream()
.filter(d -> d.getCalories() < 320)
.skip(2)
.forEach(System.out::println);
Java
복사
skip → 처음 n개의 요소를 제외한 스트림을 반환한다.
매핑( map, flatMap )
NOTE
words.stream()
.map(word -> word.split(""))
.distinct()
.forEach(System.out::println);
Java
복사
map과 같은경우, 문자열 분리시, Stream<String[]> 형식을 가진다.
한글자씩 출력하고 싶은데, String[]에 대한 list라서 잇아하게나옴..
words.stream()
.map(word -> word.split("")) // 각 단어를 개별문자를 포함하는 배열로 변환
.flatMap(Arrays::stream) // 하나의 스트림으로 반환
.distinct()
.forEach(System.out::println);
Java
복사
flatMap으로 Stream<String[]> → Stream<String> 으로 변환시켜준다!
매칭과 검색( anyMatch, allMatch, noneMatch / findFirst, findAny)
NOTE
매칭
if (Dish.menu.stream().anyMatch(Dish::isVegetarian)) {
System.out.println("메뉴에 채식주의자를 위한 음식이 있다.");
}
Java
복사
anyMatch ⇒ 하나라도 만족한다
if (Dish.menu.stream().allMatch(d -> d.getCalories() < 1000)) {
System.out.println("메뉴의 음식은 모두 건강식이다.");
}
Java
복사
allMatch ⇒ 모두 만족한다.
if (Dish.menu.stream().noneMatch(d -> d.getCalories() >= 1000)) {
System.out.println("메뉴의 음식은 모두 건강식이다.");
}
Java
복사
noneMatch ⇒ 모두 만족하지 않는다.
검색
Dish.menu.stream()
.filter(Dish::isVegetarian)
.findAny()
.ifPresent(dish -> System.out.println("dish = " + dish.getName()));
Java
복사
임의의 요소를 반환한다.
Stream.of(1, 2, 3, 4, 5)
.map(n -> n * n)
.filter(n -> n % 3 == 0)
.findFirst()
.ifPresent(System.out::println);
Java
복사
최초로 찾은 값을 반환한다.
리듀싱( reduce )
NOTE
모든 스트림 요소를 처리해서 값으로 도출하는 질의를 리듀싱 연산이라 한다!
읽어보면 좋은 글 ( 왜 reduce가 단순 for문 보다 좋은가? )
•
함수형 프로그래밍 언어 용어로는 이 과정이 마치 종이를 작은 조각이 될 때까지 반복해서 접는 것과 비슷하다는 의미로 폴드(fold)라고 부른다.
•
T reduce(T 초기값, BinaryOperator<T> 함수);
sum = numbers.stream().reduce(0, (a, b) -> a + b);
Java
복사
numbers의 모든 숫자를 더하는 리듀싱
모든 숫자를 더하는 과정
Optional<Integer> max = numbers.stream().reduce(Integer::max);
Java
복사
인수중 최대값을 구하는 방식 (초기값을 설정하지 않으면 null이 나올 수 있어 Optional로 받아짐)
Integer count = Dish.menu.stream()
.map(d -> 1)
.reduce(0, (a, b) -> a + b);
Java
복사
reduce를 활용한 메뉴의 개수 구하기
기본형 특화 스트림
NOTE
•
•
스트림 만들기
NOTE
•
•