단일 추상 메서드가 하나만 있는 걸 함수형 인터페이스라고 한다. 람다는 함수형 인터페이스에서만 쓸 수 있다.
@FunctionalInterface
public interface MyPredicate {
boolean test(int value);
}
package Ramda;
import java.util.ArrayList;
import java.util.List;
public class Filter {
public static List<Integer> filter(List<Integer> list, MyPredicate predicate) {
List<Integer> result = new ArrayList<>();
for (int val : list) {
if (predicate.test(val)) {
result.add(val);
}
}
return result;
}
public static void main(String[] args){
List<Integer> numbers = List.of(-3, -2, -1, 1, 2, 3, 5);
System.out.println("원본 리스트: " + numbers);
// 1. 음수(negative)만 뽑아내기
List<Integer> negativeList = filter(numbers, (value) -> value < 0);
System.out.println("음수 리스트" + negativeList);
// 2. 짝수(even)만 뽑아내기
List<Integer> evenList = filter(numbers, (value) -> value % 2 == 0);
System.out.println("짝수 리스트" + evenList);
}
}
Mypredicate로 만들어서 람다를 사용할 수 있다. @FunctionalInterface는 단일 추상 메서드를 보장해주는 애노테이션이다. 두 개 이상의 메서드가 들어가면 오류가 터진다.
public static List<Integer> filter(List<Integer> list, MyPredicate predicate) {
List<Integer> result = new ArrayList<>();
for (int val : list) {
if (predicate.test(val)) {
result.add(val);
}
}
return result;
}
이건 고차함수다. 함수를 반환하거나 매개변수로 받는 함수를 말한다. 여기서는 Mypredicate를 통해 함수를 받고 있다. 단순히 값을 받는 것보다 더 높은 차원에서 추상화된다고 해서 고차 함수다.