자바 8 API에 새로 추가된 기능
List<String> lowCaloricDishesName =
menu.stream()
.filter(d -> d.getCalories() < 400) // 400칼로리 이하만 선택
.sorted(comparing(Dish::getCalories)) // 칼로리로 정렬
.limit(5) // 선착순 5개만 선택
.map(Dish::getName) // 요리명 추출
.collect(toList()); // 리스트로 저장
위 코드를 멀티코어 아키텍쳐에서 병렬로 실행 가능한 코드로 만들려면 stream()
대신 parallelStream()
을 사용하면 된다
스트림: 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
filter
: 람다를 인수로 받아 스트림에서 특정 요소를 제외 시킴.filter(dish -> dishg.etCalories() > 300)
map
: 람다를 이용해 한 요소를 다른 요소로 변환하거나 정보를 추출함.map(Dish::getName)
limit
: 정해진 개수 이상의 요소가 스트림에 저장되지 못하게 스트림 크기를 축소함collect
: 스트림을 다른 형식으로 변환.collect(toList())
컬렉션: 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조
스트림: 요청할 때만 요소를 계산하는 고정된 자료구조
외부 반복(컬렉션): 사용자가 직접 요소를 반복해야 함 (예) for loop
synchronized
사용)내부 반복(스트림): 반복을 알아서 처리하고 결과 스트림값을 어딘가에 저장함
중간 연산: 연결할 수 있는 스트림 연산
연산 | 반환 형식 | 연산의 인수 | 함수 디스크립터 |
---|---|---|---|
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 | 스트림을 리듀스해서 리스트/맵/정수 형식의 컬렉션을 만듬 |
참고: Modern Java in Action (라울-게이브리얼 등 지음)