[Java] Predicate

나는양위에자는양·2024년 10월 12일

JAVA

목록 보기
1/3
post-thumbnail

Predicate란?

  • functional interface (함수형 인터페이스)
  • 입력을 받고 조건을 검사한 뒤, boolean 값을 반환

Funcational Interface (함수형 인터페이스)

  • 하나의 추상 메서드만을 가지는 인터페이스
  • 람다 표현식이나 메서드 참조를 통해 구현할 수 있음

test(T t) 메서드

@FunctionalInterface
public interface Predicate<T> {
	// 전달된 객체가 주어진 조건을 만족하는지 평가
    boolean test(T t);
}

예시1) 주어진 숫자가 짝수인지 확인하는 predicate

Predicate<Integer> isEven = number -> number % 2 == 0;
System.out.println(isEven.test(4)); // 출력: true
System.out.println(isEven.test(5)); // 출력: false

예시2) predicate를 이용해 리스트에서 짝수만 필터링

        Predicate<Integer> isEven = number -> number % 2 == 0;

        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> evenNumbers = numbers.stream()
                .filter(isEven)
                .collect(Collectors.toList());
}

그 외 기본 제공 메서드

아래와 같이 정의한다고 가정

Predicate<Integer> isEven = number -> number % 2 == 0;
Predicate<Integer> isPositive = number -> number > 0;
List<Integer> numbers = Arrays.asList(-2, -1, 0, 1, 2, 3, 4);

1. and()

  • 두 개의 predicate에 대해 논리 AND 연산 실행
Predicate<Integer> isEvenAndPositive = isEven.and(isPositive);

List<Integer> evenAndPositives = numbers.stream()
        .filter(isEvenAndPositive)
        .collect(Collectors.toList());

System.out.println(evenAndPositives); // 출력: [2, 4]

2. or()

  • 두 개의 predicate에 대해 논리 OR 연산 실행
Predicate<Integer> isEvenOrPositive = isEven.or(isPositive);

List<Integer> evenOrPositives = numbers.stream()
        .filter(isEvenOrPositive)
        .collect(Collectors.toList());

System.out.println(evenOrPositives); // 출력: [-2, 0, 1, 2, 3, 4]

3. negate()

  • predicate에 대해 논리 NOT 연산 실행
Predicate<Integer> isNotEven = isEven.negate();

List<Integer> oddNumbers = numbers.stream()
        .filter(isNotEven)
        .collect(Collectors.toList());

System.out.println(oddNumbers); // 출력: [-1, 1, 3]

4. isEqual()

  • 두 객체가 동일한지 판단 (=Objects.equals)

참고자료

Predicate 문서
모던 자바 인 액션

profile
잠을 잘 자자

0개의 댓글