Java - Predicate
👶 Predicate란?
오늘 코드분석 도중 Predicate라는 인터페이스를 만났다.
초면이었다.
Java 1.8부터 도입된 함수형 인터페이스이다.
제네릭 타입 하나를 매개변수로 전달받아 특정 작업 수행 후 boolean 타입을 반환하는 작업을 수행하게 한다.
🧭 함수형 인터페이스
= SAM Interface (Single Abstract Method)
함수형 인터페이스란, 하나의 추상 메소드를 갖고 있는 인터페이스를 말한다.
Java8부터 지원된 람다는 함수형 인터페이스로 접근 가능.
Predicate 외에도 Consumer, Supplier, Function, Comparator 등이 있다.
추가로, @FunctionalInterface 어노테이션을 사용한다.
(없어도 동작은 하지만, 함수형 인터페이스 조건이 부합하는지 검사해주므로 사용하면 좋다.)
🤔 내부 들여다보기
package java.util.function;
import java.util.Objects;
@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();
}
}
사실 그냥 인텔리제이에 Predicate 치고 import 한 다음에 타고 들어가면 나온다.
🛼 써보기
1. test()
@Test
public void test() {
Predicate<Integer> predicate = (num) -> num < 10;
assertThat(predicate.test(5)).isTrue();
}
라고 테스트를 돌려보자.
그러면 통과할 수 있다!
즉, predicate.test(5) 는 true를 반환하는데,
5가 < 10 이기 때문이라는 것이다~
2. and()
@Test
public void test() {
Predicate<Integer> predicate1 = (num) -> num < 10;
Predicate<Integer> predicate2 = (num) -> num > 0;
assertThat(predicate1.and(predicate2).test(5)).isTrue();
}
and는 두 Predidcate를 &&와 같이 이어주는 역할이다.
3. negate()
@Test
public void test() {
Predicate<Integer> predicate1 = (num) -> num < 10;
Predicate<Integer> predicate2 = predicate1.negate();
assertThat(predicate2.test(5)).isFalse();
}
negate는 부정하다라는 뜻이다.
때문에 결과를 반대로 return하게 된다.
4. or()
@Test
public void test() {
Predicate<Integer> predicate1 = (num) -> num < 10;
Predicate<Integer> predicate2 = (num) -> num > 0;
assertThat(predicate1.or(predicate2).test(-10)).isTrue();
assertThat(predicate1.or(predicate2).test(20)).isTrue();
}
||와 같다.
위 예제는 사실… 무슨 숫자를 넣어도 true 이겠다.
5. eqaul()
@Test
public void test1() {
Predicate<Integer> predicate = Predicate.isEqual(5);
assertThat(predicate1.test(5)).isTrue();
assertThat(predicate1.test(1)).isFalse();
Stream<Integer> stream = IntStream.range(1,10).boxed();
stream.filter(predicate)
.forEach(System.out::println);
}
equal은 객체가 동일한지를 검사해준다.
두 assert도 당연히 통과할 것이고,
stream은 filter에서 검사에 통과한 5만 출력되게 된다.
🙄 추가로
제네릭을 두 개 받아서 boolean을 return하는 BiPredicate
double 값을 조사하는 DoublePredicate
int 값을 조사하는 IntPredicate
long 값을 조사하는 LongPredicate
도 있고, 내부 메서드도 비슷하다.
🌐 출처
https://yeonyeon.tistory.com/200
[Java] Predicate란?
🤔 서론 우테코 오늘자 강의에서 BiPredicate라는 개념을 처음 들어보았다. Predicate란 무엇인지, 언제 사용하는 것인지 그리고 내 코드에 적용하는 과정까지를 담아본다. 생각보다 어렵지 않다. 설
yeonyeon.tistory.com
https://developer-talk.tistory.com/722
[Java]Predicate 인터페이스 사용 방법
Predicate 인터페이스 Predicate Interface는 Java에서 함수형 프로그래밍을 구현하기 위해 Java 버전 1.8부터 도입된 함수형 인터페이스로 제네릭 타입인 한 개의 매개변수를 전달받아 특정 작업을 수행
developer-talk.tistory.com
'코딩 > Java' 카테고리의 다른 글
Java - Date, LocalDate, LocalDateTime 의 차이점 및 활용법 (+ZonedDateTime) (0) | 2025.02.25 |
---|---|
Java - Arrays.asList(), List.of() (0) | 2023.07.17 |
객체지향 개발 5대 원리 - SOLID 원칙 (0) | 2023.07.07 |
Java - Long과 AtomicLong의 차이, AtomicLong에 대해 (0) | 2023.06.21 |
Java - 동시성 환경에서의 블로킹 vs 논 블로킹 (2/2) (0) | 2023.06.21 |