Find & Matching (유용함)
- 특정 속성이 데이터 집합에 포함되어있는지 여부를 검색하는 데이터 처리
- allMatch, anyMatch, noneMatch, findFirst, findAny 등의 메소드 제공
Find
.findFirst(), .findAny() 를 가장 많이 쓴다.
Optional<Dish> dish = menu.stream()
.filter(Dish::isVegerarian)
.findAny();
Optional 이란?
- Null 요소를 유연하게 처리할 수 있는 방법 ( class )
- 네 가지 기능 제공
- isPresent() : Optional이 값을 포함하면 true, 아니라면 false를 반환
- isPresent(Consumer
<T>
block) : Optional 에 값이 있을 때만 Comsumer를 실행- T get() : Optional에 값이 있을 경우 값을 반환, 그렇지 않을 경우 “NoSuchElementException” 발생
- T orElse(T other) : Optional에 값이 있을 경우 값을 반환. 없을 경우 other 값을 반환 // 제일 많이 씀
< findAny와 findFirst의 차이 >
findAny : 임의의 요소를 가져옴. 주로 병렬 스트림에서 사용함.
병렬스트림에서 첫 번째 요소의 의미가 존재하지 않음.
findFirst : 첫 번째 요소를 가져옴. 일반 스트림에서 사용함.
public static void main(String[] args) {
List<Dish> menu = DishData.menu;
// 스트림 내부에서 임의의 데이터 가져오기
Optional<Dish> vegeterianDish = menu.stream()
.filter(dish -> dish.isVegetarian())
.findAny();
// Optional
// 데이터가 null 일 수도 아닐 수도 있는 특별한 클래스.
// orElse: Optional Data가 null 일 때 other의 값을 반환시키도록 하는 메소드.
Dish dish = vegeterianDish.orElse(null);
System.out.println(dish);
Dish fatDish = menu.stream()
.filter(d -> d.getCalories() > 100)
.findFirst() // Optional<Dish>
.orElse(null); // 데이터가 없다면 null을 반환해라
System.out.println(fatDish);
}
Matching
public static void main(String[] args) {
List<Dish> menu = DishData.menu;
// 중간함수 (Stream 반환)
// filter
// map, flatMap
// distinct
// skip, limit
// peek
// 최종함수 (Stream을 반환시키지 않는 것)
// forEach: void
// collect: T
// anyMatch: boolean
// Stream 내부에 채식 요리가 한개라도 있으면 true
boolean isVegetarian = menu.stream() // Stream<Dish>
.anyMatch(dish -> dish.isVegetarian());
long vegeterianCount = menu.stream() // anyMatch로 안해도 이렇게 가능
.filter(dish -> dish.isVegetarian())
.count(); // 최종함수
if(vegeterianCount > 0) {
System.out.println("채식주의자를 위한 요리가 준비되어있습니다!2");
}
if(isVegetarian) {
System.out.println("채식주의자를 위한 요리가 준비되어있습니다!");
}
// Stream 내부의 요리가 모두 1000kcal 미만이라면 true
boolean isHealthy = menu.stream()
.allMatch(dish -> dish.getCalories() < 1000);
if(isHealthy) {
System.out.println("우리 식당은 모두 다이어트 식단을 제공합니다!");
}
// Stream 내부의 요리 중 1000kcal를 초과하는 요리가 없다면 true
// allMatch와 반대
isHealthy = menu.stream()
.noneMatch(dish -> dish.getCalories() >= 1000);
if(isHealthy) {
System.out.println("우리 식당은 모두 다이어트 식단을 제공합니다!2");
}