Predicate 종류의 함수적 인터페이스는 and(), or(), negate() 디폴트 메소드를 가지고 있다. 이 메소드들은 각각 논리 연산자인 &&, ||, ! 와 대응된다고 볼 수 있다. and() 메소드는 두 Predicate가 모두 true를 리턴하면 최종적으로 ture를 리턴하는 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 |
다음 예제는 2의 배수와 3의 배수를 조사하는 두 Predicate를 논리 연산한 새로운 Predicate를 생성한다.
// PredicateAndOrNegateExample.java -- Predicate 간의 논리 연산
import java.util.function.IntPredicate;
public class PredicateAndOrNegateExample {
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.and(predicateB);
result = predicateAB.test(9);
System.out.println("9는 2 또는 3의 배수입니까? " + result);
// negate()
predicateAB = predicateA.negate();
result = predicateAB.test(9);
System.out.println("9는 홀수입니까? " + result);
}
}
Predicate<T> 함수적 인터페이스는 and(), or(), negate() 디폴트 메소드 이외에 isEqual() 정적 메소드를 추가로 제공한다. isEqual() 메소드는 test() 매개값인 sourceObject와 isEqual()의 매개값인 targetObject를 java.util.Objects 클래스의 equals()의 매개값으로 제공하고, Objects.equals(sourceObject, targetObject)의 리턴값을 얻어 새로운 Predicate<T>를 생성한다.
Predicate<Object> predicate = Predicate.isEqual(targetObject);
boolean result = predicate.test(sourceObject);
Object.equals(sourceObject, targetObejct)는 다음과 같은 리턴값을 제공한다.
sourceObject | targetObejct | 리턴값 |
null | null | true |
not null | null | false |
null | not null | false |
not null | not null | sourceObejct.equals(targetObject)의 리턴값 |
다음 예제는 두 문자열을 비교하기 위해 Predicate의 isEqaul() 정적 메소드를 사용하였다.
// PredicateIsEqualExample.java --IsEqual() 정적 메소드
import java.util.function.Predicate;
public class PredicateIsEqualExample {
public static void main(String[] args) {
Predicate<String> predicate;
predicate = Predicate.isEqual(null);
System.out.println("null, null: " + predicate.test(null));
predicate = Predicate.isEqual("Java8");
System.out.println("null, Java8: " + predicate.test(null));
predicate = Predicate.isEqual(null);
System.out.println("Java8, null: " + predicate.test("Java8"));
predicate = Predicate.isEqual("Java8");
System.out.println("Java8, Java8: " + predicate.test("Java8"));
predicate = Predicate.isEqual("Java8");
System.out.println("Java7, Java8: " + predicate.test("Java7"));
}
}
'Java 길찾기 > 이것이 자바다' 카테고리의 다른 글
[Java] 메소드 참조 (0) | 2022.05.02 |
---|---|
[Java] 표준 API의 함수적 인터페이스 - minBy(), maxBy() 정적 메소드 (0) | 2022.04.28 |
[Java] 표준 API의 함수적 인터페이스 - andThen(), compose() 디폴트 메소드 (0) | 2022.04.19 |
[Java] 표준 API의 함수적 인터페이스 - Operator, Predicate (0) | 2022.04.18 |
[Java] 표준 API의 함수적 인터페이스 - Suplier, Function (0) | 2022.04.15 |