Predicate<T>는 하나의 입력을 받아 true 또는 false를 반환하는 함수형 인터페이스다.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
즉, 특정 조건을 검사하는 용도로 쓰이며, Stream API의 filter 메서드 등과 함께 자주 사용된다.
Predicate<String> isNotEmpty = s -> !s.isEmpty();
System.out.println(isNotEmpty.test("hello")); // true
System.out.println(isNotEmpty.test("")); // false
가장 기본적인 메서드. 입력값에 대해 조건을 검사한다.
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
두 조건이 모두 true일 때 true 반환
Predicate<Integer> isPositive = n -> n > 0;
Predicate<Integer> isEven = n -> n % 2 == 0;
Predicate<Integer> isPositiveAndEven = isPositive.and(isEven);
System.out.println(isPositiveAndEven.test(4)); // true
System.out.println(isPositiveAndEven.test(-2)); // false
하나라도 true면 true 반환
Predicate<Integer> isZero = n -> n == 0;
Predicate<Integer> isNegative = n -> n < 0;
Predicate<Integer> isZeroOrNegative = isZero.or(isNegative);
System.out.println(isZeroOrNegative.test(-5)); // true
System.out.println(isZeroOrNegative.test(0)); // true
System.out.println(isZeroOrNegative.test(3)); // false
조건을 반대로 뒤집음
Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();
System.out.println(isNotEmpty.test("")); // false
System.out.println(isNotEmpty.test("java")); // true
List<String> names = List.of("Alice", "", "Bob", "", "Charlie");
List<String> filtered = names.stream()
.filter(((Predicate<String>) String::isEmpty).negate()) // 빈 문자열 제거
.collect(Collectors.toList());
System.out.println(filtered); // [Alice, Bob, Charlie]
| 기능 | 메서드 | 설명 |
|---|---|---|
| 조건 검사 | test(T t) | 기본 조건 검사 |
| AND | and(Predicate) | 두 조건 모두 만족할 때 |
| OR | or(Predicate) | 하나라도 만족할 때 |
| NOT | negate() | 조건 반전 |
Predicate는 자바에서 조건문을 더욱 유연하고 재사용 가능하게 만들어주는 강력한 도구다. Stream, Optional, 사용자 정의 조건 분리 등에 널리 활용되므로 자바 개발자라면 반드시 익혀야 할 인터페이스 중 하나다.