Day 12 자바 객체 지향 연습

정채림·2026년 1월 16일
/**
     * @requirement : 특정 리스트에서 특정 조건의 사과들만 필터링하는 기능을 만드세요
     * @param originList : 모든 데이터가 담긴 리스트
     * @return : 특정 조건에 맞는 데이터들이 담긴 새로운 리스트를 반환해주세요.
     */
    public static <T> List<T> filter(List<T> originList, GenericPredicate<T> predicate) {
        // 1. 특정 필터링된 데이터들만 담을 바구니
        List<T> filteredBasket = new ArrayList<>();

        // 2. 반복문과 조건문을 통해 필터링
        for (T t : originList) {
            if (predicate.test(t)) {
                filteredBasket.add(t);
            }
        }
        return filteredBasket;
    }
}
public class Main {
    public static void main(String[] args) {
        System.out.println("==== 숫자 리스트에서 짝수만 필터링");
        List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 99, 88, 34);

        List<Integer> filter1 = filter(integerList, n -> n % 2 == 0);
        System.out.println("filter1 = " + filter1);
        System.out.println("==== 음식 리스트에서 3글자 음식만 필터링");

        List<String> filter2 = filter(List.of("짜장면", "치킨", "족발", "탕수육", "오렌지"), str -> str.length() == 3);
        System.out.println("filter2 = " + filter2);

        List<Apple> filter3 = filter(appleBasket, a -> a.getColor() == RED || a.getColor() == YELLOW);
        filter3.forEach(System.out::println);
    }
}

Generic & Lambda

  • filter 함수가 모든 타입을 받을 수 있도록 제너릭 타입으로 선언한다.
public static <T> List<T> filter (List<T> originList, GenericPredicate<T> predicate){}
  • Lambda 식으로 predicate를 전달할 수도 있다.
// 3글자인 요소만 필터링.
List<String> filter = filter(List.of("..."), str->str.length == 3);
  • 다음에 배울 스트림을 쓴다면 아마 이렇게 되지 않을까 싶다.
List<String> filter = List.of("...").stream()
									.map(str-> str.length == 3)
                                    .collect(Collectors.toList());
										
  • 람다와 스트림 그리고 추상화를 잘 활용하면 코드도 가독성있게 줄이고 보다 객체지향적으로 코딩을 할 수 있을 것이다.

0개의 댓글