Predicate는 Type T 인자(위 예시는 Apple클래스)를 받고 boolean을 리턴하는 함수형 인터페이스입니다.
함수형 인터페이스는 오직 하나의 추상 메서드만을 가집니다. (인터페이스이기에 default 메서드는 가질수있음)
Predicate는 test(T t) 추상메서드 하나만을 가지고 있죠
인자 t를 받아서 boolean형태를 리턴하는 메서드입니다.
public class FilteringApple {
public static boolean isHeavyApple(Apple apple){
return apple.getWeight() > 150;
}
public static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
public static void main(String[] args) {
List<Apple> inventory = Arrays.asList(
new Apple(80, "green"),
new Apple(155, "green"),
new Apple(120, "red")
);
filterApples(inventory, FilteringApple::isHeavyApple);
}
}
함수형 인터페이스는 1개의 추상 메서드를 갖고 있는 인터페이스를 말합니다.
자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문에, 함수형 인터페이스는 람다식으로 만든 객체에 접근하기 위해 사용됩니다.
람다식을 사용할 때마다 함수형 인터페이스를 매번 정의하기 불편해서 아예 라이브러리로 제공하는 것들이 있는데, 자바 8에서 제공하는 주요 함수형 인터페이스는 java.util.function 패키지에 다음과 같이 있습니다.
Predicate는 패키지에 정의되어 있는 인터페이스이고, 모든 메서드를 담을 수 있는 것 같지만, 타입이 아닌 인터페이스 개념으로 보시면 될 것 같습니다.
👊 추가로 인터페이스와 타입의 차이에 관해 참고하면 좋으실 것 같은 자료 첨부합니다.
인터페이스에서 할 수 있는 대부분의 기능들은 타입에서 가능하지만,
한 가지 중요한 차이점은 타입은 새로운 속성을 추가하기 위해서 다시 같은 이름으로 선언할 수 없지만, 인터페이스는 항상 선언적 확장이 가능하다는 것입니다. 그 차이에 대한 예제가 아래 내용입니다.
또한, 인터페이스는 객체에만 사용이 가능합니다.
git : https://github.com/BanditBool2/ReadingRecord/issues/3
도움 주신 분 : kkambbak1 , parkchaewon18