프로그래밍/Java

자바에서 제공하는 함수형 인터페이스

개발정리 2022. 6. 7. 23:12

함수형 인터페이스를 따로 정의하지 않고도 자바에서 기본으로 제공하는 함수형 인터페이스가 있다.

이를통해 람다 표현식, 메서드 레퍼런스, 생성자 레퍼런스를 사용해서 구현할 수 있는 함수형 인터페이스를 살펴보자.

 

 

 

자바에서 미리 정의해둔 자주 사용할만한 함수 인터페이스


Function<T, R>

T타입을받아서R타입을리턴하는함수인터페이스

import java.util.function.Function;

class Plus10 implements Function<Integer, Integer> {
  @Override
  public Integer apply(Integer integer) {
    return integer + 10;
  }
}

public class Foo {

  public static void main(String[] args) {

    // 방법 1
    Plus10 plus10 = new Plus10();
    System.out.println(plus10.apply(1));

    // 방법 2, 람다 표현식을 사용하여 클래스 필요 없이 바로 구현 가능
    Function<Integer, Integer> plus20 = (i) -> i + 20;
    System.out.println(plus20.apply(1));

    // 함수를 조합할 수 있는 메서드를 default 메서드로 제공한다.
    // compose? x2 먼저 실행 후 +10 실행
    Function<Integer, Integer> multiply2 = (i) -> i * 2;
    Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
    System.out.println(multiply2AndPlus10.apply(2));

	// andThen? +10 실행 후 x2 실행
    Function<Integer, Integer> Plus10Andmultiply2 = plus10.andThen(multiply2); 
    System.out.println(Plus10Andmultiply2.apply(2));
  }
}

 

BiFunction<T, U, R>

두개의값(T,U)를받아서R타입을리턴하는함수인터페이스

 

Consumer<T>

T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스

import java.util.function.Consumer;

public class Foo {

  public static void main(String[] args) {
    // 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
    Consumer<Integer> printT = i -> System.out.println(i);
    printT.accept(10);
  }
}

 

Supplier<T>

T 타입의 값을 제공하는 함수 인터페이스

import java.util.function.Supplier;

public class Foo {
  public static void main(String[] args) {
    // 타입의 값을 제공하는 함수 인터페이스, 아무 값도 파라미터로 받지 않고 주기만 한다.
    Supplier<Integer> get10 = () -> 10;
    System.out.println(get10.get());
  }
}

 

Predicate<T>

T 타입을 받아서 boolean을 리턴하는 함수 인터페이스

import java.util.function.Predicate;

public class Foo {
  public static void main(String[] args) {
    // 인자를 받아서 boolean을 리턴하는 함수 인터페이스
    Predicate<String> startWithHK = (s) -> s.startsWith("s");
  }
}

 

UnaryOperator<T>

Function<T, R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스

import java.util.function.UnaryOperator;

public class Foo {
  public static void main(String[] args) {
    // 입력 타입과 리턴 타입이 같으면 UnaryOperator 를 사용할 수 있다.
    // Function<Integer, Integer> 할 필요가 없다.
    UnaryOperator<Integer> plus30 = (i) -> i + 20;
  }
}

 

BinaryOperator<T>

BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입렵값 두개를 받아 리턴하는 함수 인터페이스

import java.util.function.BinaryOperator;

public class Foo {
  public static void main(String[] args) {
    // BiFunction 에 특수한 형태로, 세개의 타입이 모두 같은경우 쓰일수 있다는 것이다.
    BinaryOperator<Integer> test = (a,b) -> a + b + 20;
  }
}

 

이 처럼 Java 가 제공해주는 함수형 인터페이스를 이용하여 새로운 함수형 인터페이스를 사용하지 않고도 작업이 가능하다.

위 항목 외에도 많은 함수형 인터페이스를 제공하니 필요할 때 마다 찾아쓰면 된다.

 

 

참고


자바가 제공해주는 함수형 인터페이스

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

 

백기선 - 더 자바, Java8
https://www.inflearn.com/course/the-java-java8/dashboard

 

'프로그래밍 > Java' 카테고리의 다른 글

인터페이스 default 메소드와 static 메소드  (0) 2022.06.09
메소드 레퍼런스  (0) 2022.06.08
함수형 인터페이스와 람다 표현식 소개  (0) 2022.06.07
Metaspace  (0) 2022.05.06
배열 Parallel 정렬  (0) 2022.05.06