반응형
Java에서 함수형 프로그래밍을 지원하기 위해 인터페이스와 함수형 인터페이스를 포함하는 패키지이다. 이 패키지는 람다 표현식과 스트림API와 함께 사용되며, 함수형 프로그래밍 스타일로 코드를 작성할 수 있게 도와 준다.
매번 새로운 함수형 인터페이스를 정의하는 것보다 가능하면, function 패키지의 인터페이스를 활용하는 것이 일관성 측면이나, 재사용성에서 효율이 좋다.
function 패키지의 주요 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
java.lang.Runnable | void run() | - 매개변수 x - 반환 값 x |
Supplier<T> | T get() | - 매개변수 x - 반환 값 o |
Consumer<T> | void accept(T t) | - 매개변수 o - 반환 값 x - Supplier와 반대 |
Function<T, R> | R apply(T t) | - 매개변수 1개 - 반환 값 o |
Predicate<T> | boolean test(T t) | -조건식 표현에 사용됨 - 매개변수 1개 - 반환 값 boolean - Function의 변형, 반환 값만 다 |
*참고* 수학에서 결과로 true, false를 반환하는 함수를 프레디케이트(predicate)라고 한다. |
function 패키지의 인터페이스 간단한 예제
// Runnable 매개변수x 반환값x
Runnable runnable = () -> System.out.println("run() 실행.");
runnable.run(); // run() 실행.
// Supplier 매개변수x 반환값o
Supplier<Integer> supplier = () -> 1+2+3+4;
supplier.get(); // 10
// Consumer 매개변수o 반환값x
Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("난 매개변수"); // 난 매개변수
// Function 매개변수 1개 반환값o
Function<Integer, Integer> function = (x)-> x+2;
function.apply(1); // 3
// Predicate 매개변수 1개 반환값 boolean
Predicate<Integer> predicate = (x)-> x==2;
predicate.test(2); // true
매개변수가 2개인 함수형 인터페이스
- 인터페이스 이름 앞에 접두사 'Bi'가 붙는다.
함수형 인터페이스 | 메서드 | 설명 |
BiConsumer<T, U> | void accept(T t, U u) | - 매개변수 2개 - 반환값 x |
BiPredicate<T, U> | boolean test(T t, U u) | - 조건식 표현에 사용 - 매개변수 2개 - 반환값은 boolean |
BiFunction<T, U, R> | R apply (T t, U u) | - 매개변수 2개 - 반환값o |
BiConsumer<Integer, Integer> bc = (x, y) -> System.out.println("첫 번째 : " + x + "두 번째 : " + y);
bc.accept(1, 2); // 첫 번째 : 1 두 번째 : 2
BiPredicate<Integer, Integer> bp = (x, y) -> x == y;
bp.test(1, 2); // false
BiFunction<Integer, Integer, int[]> bf = (x, y) -> new int[]{x, y};
bf.apply(1, 2); // [1,2]
*참고* BiSupplier가 없는 이유는 Sipplier는 매개변수가 없고 반환 값이 2개가 될 수 없기 때문이다. |
매개변수를 3개 이상 필요한 경우에는 함수형 인터페이스를 직접 만들어서 써야한다.
@FunctionalInterface
interface TriFunction(T,U,V,R){
R apply(T t, U u, V v);
}
컬렉션 프레임웍의 함수형 인터페이스
간단한 사용 예제
ArrayList<Integer> list = new ArrayList<>();
for(int i=0; i<10; i++) list.add(i);
// list 요소 출력
list.forEach(i-> System.out.println(i));
// list에서 2 또는 3의 배수를 제거
list.removeIf(x-> x%2==0 || x%3==0);
//list의 모든 요소에 10을 곱한다.
list.replaceAll(i->i*10);
반응형
'Java > 람다와 스트림' 카테고리의 다른 글
스트림(stream) - 기본 (0) | 2023.09.25 |
---|---|
(람다식) 함수형 인터페이스와 메소드 레퍼런스 (0) | 2023.09.05 |
람다식이란? (0) | 2023.09.04 |