Predicate의 결합, 컬렉션 프레임워크와 함수형 인터페이스

장서연·2022년 1월 17일
0

Predicate의 결합

@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;
  • and(), or(), negate()로 두 Predicate를 하나로 결합(default 메서드)
  • negate는 ! 즉 not을 의미한다
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
    }
}

컬렉션 프레임워크와 함수형 인터페이스

  • 함수형 인터페이스를 사용하는 컬렉션 프레임워크의 메서드
인터페이스메서드설명
Collectionboolean removeIf(Predicate filter)조건에 맞는 요소를 삭제
Listvoid replace(UnaryOperator operator)모든 요소를 변환하여 대체
Iterablevoid forEach(Consumer action)모든 요소에 작업 action을 수행
MapV 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));

이렇게 람다를 활용함으로써,컬렉션 프레임워크를 사용할 때 코드가 짧아지게 할 수 있다!

0개의 댓글