Search
Duplicate
📒

[Java Study] 11-x. 스트림(Stream)활용

상태
미진행
수업
Java Study
주제
Stream
4 more properties
참고

스트림 활용

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