코딩 기록들

[Java Stream Programming] 4. Filtering & Slicing 본문

카테고리 없음

[Java Stream Programming] 4. Filtering & Slicing

코딩펭귄 2024. 2. 7. 17:42
필터링
- filter()
List<Dish> vegitarianMenu = 
        menu.stream()
            // 채식 요리인지 확인하는 메서드 레퍼런스
            .filter(Dish::isVegerarian)
            .collect(Collectors.toList());

필터링 동작원리

필터링 예제

List<Dish> menu = DishData.menu;

menu.stream() //Stream<Dish>
    //이 filter를 제일 많이 씀
    //Stream<Dish> = {french fries, rice, season fruit};
    .filter((Dish dish) -> dish.isVegetarian()) //boolean의 결과가 true라면 스트림으로 만들어줌

    //반복하며 출력
    //forEach : Consumer<Dish> : filter가 만들어준 새로운 Stream<Dish>를 반복하겠다	
    .forEach((Dish dish) -> {
        System.out.println("Stream 이름: " + dish); //메뉴명
        System.out.println("Stream 채식여부: " + dish.isVegetarian()); // false = 채식아님
    });

 

고유요소 필터링
- distinct() : 중복되는 데이터 전부 제거
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream()
       .filter(i -> i % 2 == 0) //2,2,4
       .distinct() //중복되는 데이터 전부 다 제거 -> 2,4, Stream 만든다
       .forEach(System.out::println);

distinct 동작원리

distinct 예제

List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
	//짝수만 추려와서 중복을 제거하고 나머지를 출력
numbers.stream() //Stream<Integer>로 만들어짐
    .filter((Integer n) -> n % 2 == 0) //결과 : Steram<Integer> = {2,2,4}
    //Stream<Integer> = {2,4}
    .distinct() //알아서 중복값 제거
    .forEach((Integer n) -> System.out.println(n));
    ;

 

 

스트림 축소 : limit(숫자)
List<Dish> dishes = 
            menu.stream()
                .filter(d -> d.getCalories() > 300)
                .limit(3)
                .collect(Collectors.toList());

 

요소 건너띄기 : skip(숫자)
List<Dish> dishes = 
            menu.stream()
                .filter(d -> d.getCalories() > 300)
                .skip(2)
                .collect(Collectors.toList());

 

* Slicing 할때는 skip, limit의 순서에 유의해야함

 

스트림축소 예제

// 스트림 축소 : 메뉴 중 칼로리가 300보다 큰 것 중 아무거나(정렬안된 데이터의 앞) 
//              3개 가져와서 조회

// 1st for문으로 만들어보기 : 1. 3개만 담을 새로운 array list 만들어줌
List<Dish> dishes = new ArrayList<>();
for (Dish dish : menu) {
    if (dish.getCalories() > 300) {
        dishes.add(dish);
    }
    if (dishes.size() == 3) {
        break;
    }
}System.out.println(dishes);
	
    
// 2nd. 스트림으로 만들어보기 : 스트림 내부에서 앞에있는 아무거나 3개 가져와라
menu.stream()
    .filter((Dish dish) -> dish.getCalories() > 300)
    .limit(3)
    .forEach((Dish dish) -> {
        System.out.println("칼로리가 300보다 큰 랜덤한 3가지 음식: " + dish); // false = 채식아님
    });