@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
    @SuppressWarnings("unchecked")
    static <T> Predicate<T> not(Predicate<? super T> target) {
        Objects.requireNonNull(target);
        return (Predicate<T>)target.negate();
    }
}
아래에 3개의 Predicate 가 있다.
Predicate<Integer> p = i -> i < 100; 
Predicate<Integer> q = i -> i< 200;
Predicate<Integer> r = i -> i%2 == 0;
public class MyPredicate {
    public static void main(String[] args){
        Predicate<Integer> p = i -> i < 100;
        Predicate<Integer> q = i -> i< 200;
        Predicate<Integer> r = i -> i%2 == 0;
        Predicate<Integer> notP = p.negate(); // i >= 100
        Predicate<Integer> all = notP.and(q).or(r); // 100<= && i<200 || i%2==0
    }
}
| 인터페이스 | 메서드 | 설명 | 
|---|---|---|
| Collection | boolean removeIf(Predicate filter) | 조건에 맞는 요소를 삭제 | 
| List | void replace(UnaryOperator operator) | 모든 요소를 변환하여 대체 | 
| Iterable | void forEach(Consumer action) | 모든 요소에 작업 action을 수행 | 
| Map | V compute(K key, V value, BiFunction<K,V,V> f) | 지정된 키의 값에 작업 f를 수행 | 
| void forEach(BiConsumer<K,V> action) | 모든 요소에 작업 action을 수행 | 
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// for 문으로 출력하기
for(String s: list){
    System.out.println(s);
}
// forEach 함수
list.forEach(s -> System.out.println(s));
이렇게 람다를 활용함으로써,컬렉션 프레임워크를 사용할 때 코드가 짧아지게 할 수 있다!