/**
* @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());
- 람다와 스트림 그리고 추상화를 잘 활용하면 코드도 가독성있게 줄이고 보다 객체지향적으로 코딩을 할 수 있을 것이다.