@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));
이렇게 람다를 활용함으로써,컬렉션 프레임워크를 사용할 때 코드가 짧아지게 할 수 있다!