이번 아티클에서는 우리가 배웠던 함수적 인터페이스 중 Predicate 함수적 인터페이스의 내용을 살펴봅니다. boolean 리턴 기능을 중심으로 설명했었던 것을 기억하실 것입니다. xxxTest() 추상 메서드도 기억나시나요? 잊었다면 다시 복습하고 내용을 상기해 보도록 합시다.
함수적 인터페이스 Predicate에도 디폴트 메서드와 정적 메서드가 존재합니다. 우선 디폴트 메서드를 살펴보도록 하겠습니다. 디폴트 메서드는 각각 and( ), or( ), negate( )입니다. 이 세 개는 각각 &&, ||, !에 대응하는 디폴트 메서드입니다.
이는 간단하게 설명할 수 있습니다. and( )는 &&타입입니다. 즉, 두 Predicate가 모두 true를 리턴하면 최종적으로 true를 리턴하는 Predicate를 생성합니다.
or( )는 ||에 대응하니, 결국 두 Predicate 중 하나만 true를 리턴하더라도 최종적으로 true를 리턴하는 Predicate를 생성하게 됩니다.
negate( )의 경우, !에 대응하므로 원래 Predicate의 결과가 true이면 false로, false이면 true를 리턴하는 새로운 Predicate를 생성하게 됩니다. 아래와 같이 and( ), or( ), negate( )를 제공하는 Predicate 함수적 인터페이스를 살펴보겠습니다.
분류 | 함수적 인터페이스 | and( ) | or( ) | negate( ) |
Predicate | Predicate<T> | O | O | O |
BiPredicate<T, U> | O | O | O | |
DoublePredicate | O | O | O | |
IntPredicate | O | O | O | |
LongPredicate | O | O | O |
이제 특정 정수(int)를 파라미터에 입력했을 때, 해당 정수가 2의 배수인지 또는 3의 배수인지 여부를 검사하는 연산을 진행해 보겠습니다.
import java.util.function.IntPredicate;
public class ExampleMain {
public static void main(String[] args) {
// 2의 배수 검사
IntPredicate predicateA = a -> a % 2 == 0;
// 3의 배수 검사
IntPredicate predicateB = a -> a % 3 == 0;
IntPredicate predicateAB;
boolean result;
// and()
predicateAB = predicateA.and(predicateB);
result = predicateAB.test(9);
System.out.println("9는 2와 3의 배수입니까? : " + result);
// or()
predicateAB = predicateA.or(predicateB);
result = predicateAB.test(9);
System.out.println("9는 2또는 3의 배수입니까? : " + result);
// neglate()
predicateAB = predicateA.negate();
result = predicateAB.test(9);
System.out.println("9는 홀수입니까? :" + result);
}
}
/* 출력
9는 2와 3의 배수입니까? : false
9는 2또는 3의 배수입니까? : true
9는 홀수입니까? :true
*/