(Java Stream Programming) 5. Find & Matching

soosoorim·2024년 2월 20일
0

Find & Matching (유용함)

  • 특정 속성이 데이터 집합에 포함되어있는지 여부를 검색하는 데이터 처리
  • allMatch, anyMatch, noneMatch, findFirst, findAny 등의 메소드 제공

Find
.findFirst(), .findAny() 를 가장 많이 쓴다.

  • 스트림 내에서 임의요소 가져오기
Optional<Dish> dish = menu.stream()
                          .filter(Dish::isVegerarian)
                          .findAny();

Optional 이란?

  • Null 요소를 유연하게 처리할 수 있는 방법 ( class )
  • 네 가지 기능 제공
  1. isPresent() : Optional이 값을 포함하면 true, 아니라면 false를 반환
  2. isPresent(Consumer<T> block) : Optional 에 값이 있을 때만 Comsumer를 실행
  3. T get() : Optional에 값이 있을 경우 값을 반환, 그렇지 않을 경우 “NoSuchElementException” 발생
  4. 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");
		}

0개의 댓글

관련 채용 정보