Predicate는 해당 값이 참인지 거짓인지 구분해주는 함수다.
test라는 추상 메소드를 가지고 있으며 하나의 파라미터를 받을 수 있다.
예를 들어 Integer를 받아와서 해당 값이 0보다 큰 지 구분하는 기능은 아래와 같다.
public class Main {
public static void main(String[] args){
Predicate<Integer> isPositive = x -> x > 0;
boolean result = isPositive.test(10);
System.out.println(result);
}
}
이전에 구현했던 ForEach와 Predicate를 조합하면 Filter를 구현할 수 있다.
Filter는 List를 받아와서 넘겨 받은 Predicate가 참인 값만 추린 List를 반환하는 함수다.
예를 들어 1~5까지 수가 담겨있는 리스트에서 3 이상의 값만 추려내는 fillter를 구현하면 아래와 같다.
추가적으로 forEach와 적절히 조합하여 하나씩 출력할 수 있다.
public class Filter {
public static void main(String[] args){
List<Integer> iList = Arrays.asList(1,2,3,4,5);
forEach(
filter(iList, (x)-> x > 3),
(x) -> System.out.println(x));
}
public static <T> void forEach(
List<T> list, Consumer<T> processor
){
for(T t : list){
processor.accept(t);
}
}
public static <T> List<T> filter(List<T> list, Predicate<T> process){
List<T> newList = new ArrayList<>();
forEach(list, (x)->{
if(process.test(x)){
newList.add(x);
}
});
return newList;
}
}