English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 플로우 컨트롤

Java 배열

Java 오브젝트 방향적(I)

Java 오브젝트 방향적(II)

Java 오브젝트 방향적(III)

Java 예외 처리

Java 리스트(List)

Java Queue(큐)

Java Map 셋

Java Set 셋

Java 입력/출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 8 함수형 인터페이스

Java 8 새로운 기능

함수형 인터페이스(Functional Interface)은 하나의 추상 메서드를 가지고 있으며, 여러 개의 비 추상 메서드를 가질 수 있는 인터페이스입니다.

함수형 인터페이스는 lambda 표현식으로 익히 될 수 있습니다.

Lambda 표현식과 메서드 참조(실제로는 Lambda 표현식으로 간주할 수 있습니다)에서 사용됩니다.

예를 들어 다음과 같은 함수형 인터페이스를 정의했습니다:

@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

그런 다음 Lambda 표현식을 사용하여 이 인터페이스의 하나의 구현을 표현할 수 있습니다(주의: JAVA 8 이전에는 일반적으로 익명 클래스로 구현되었습니다):

GreetingService greetService1 message -> System.out.println("Hello ") + message);

함수형 인터페이스는 기존 함수를 람다와 잘 맞춤으로 지원합니다.

JDK 1.8 이전에 존재하는 함수형 인터페이스:

  • java.lang.Runnable

  • java.util.concurrent.Callable

  • java.security.PrivilegedAction

  • java.util.Comparator

  • java.io.FileFilter

  • java.nio.file.PathMatcher

  • java.lang.reflect.InvocationHandler

  • java.beans.PropertyChangeListener

  • java.awt.event.ActionListener

  • javax.swing.event.ChangeListener

JDK 1.8 새로 추가된 함수 인터페이스:

  • java.util.function

java.util.function 이는 Java의 함수형 프로그래밍을 지원하기 위해 많은 클래스를 포함하고 있으며, 이 패키지의 함수형 인터페이스는 다음과 같습니다:

순번인터페이스 & 설명
1BiConsumer<T,U>

두 입력 파라미터를 받는 작업을 대표하며 어떠한 결과도 반환하지 않음

2BiFunction<T,U,R>

두 입력 파라미터를 받는 메서드를 대표하며 결과를 반환

3BinaryOperator<T>

두 동일한 타입의 연산자에 대해 작업을 수행하며 동일한 타입의 결과를 반환

4BiPredicate<T,U>

두 파라미터를 가진 boolean 메서드를 대표

5BooleanSupplier

boolean 값 결과를 제공하는 대상

6Consumer<T>

입력 파라미터를 받는 작업을 대표하며 결과를 반환하지 않음

7DoubleBinaryOperator

두 double 값에 대한 연산자를 대표하며 double 값 결과를 반환

8DoubleConsumer

double 값 파라미터를 받는 작업을 대표하며 결과를 반환하지 않음

9DoubleFunction<R>

double 값 파라미터를 받는 메서드를 대표하며 결과를 반환

10DoublePredicate

double 값 파라미터를 가진 boolean 메서드를 대표

11DoubleSupplier

double 값 구조를 제공하는 대상

12DoubleToIntFunction

double 타입의 입력을 받아 int 타입의 결과를 반환합니다.

13DoubleToLongFunction

double 타입의 입력을 받아 long 타입의 결과를 반환합니다.

14DoubleUnaryOperator

매개변수와 반환 값이 모두 double 타입인 경우를 받아들입니다.

15Function<T,R>

입력 매개변수를 받아 결과를 반환합니다.

16IntBinaryOperator

두 매개변수가 모두 int 타입이며, 반환 값도 int 타입인 경우를 받아들입니다.

17IntConsumer

int 타입의 입력 매개변수를 받아 반환 값이 없습니다.

18IntFunction<R>

int 타입의 입력 매개변수를 받아 결과를 반환합니다.

19IntPredicate

int 입력 매개변수를 받아 boolean 타입의 결과를 반환합니다.

20IntSupplier

매개변수가 없으며, 결과 값이 int 타입입니다.

21IntToDoubleFunction

int 타입의 입력을 받아 double 타입의 결과를 반환합니다.

22IntToLongFunction

int 타입의 입력을 받아 long 타입의 결과를 반환합니다.

23IntUnaryOperator

매개변수와 반환 값이 모두 int 타입인 경우를 받아들입니다.

24LongBinaryOperator

두 매개변수가 모두 long 타입이며, 반환 값도 long 타입인 경우를 받아들입니다.

25LongConsumer

long 타입의 입력 매개변수를 받아 반환 값이 없습니다.

26LongFunction<R>

long 타입의 입력 매개변수를 받아 결과를 반환합니다.

27LongPredicate

long 입력 매개변수를 받아 boolean 타입의 결과를 반환합니다.

28LongSupplier

매개변수가 없으며, 결과 값이 long 타입입니다.

29LongToDoubleFunction

long 타입의 입력을 받아 double 타입의 결과를 반환합니다.

30LongToIntFunction

long 타입의 입력을 받아 int 타입의 결과를 반환합니다.

31LongUnaryOperator

매개변수와 반환 값이 모두 long 타입인 경우를 받아들입니다.

32ObjDoubleConsumer<T>

Object 타입과 double 타입의 입력 매개변수를 받아들여, 반환 값이 없습니다.

33ObjIntConsumer<T>

Object 타입과 int 타입의 입력 매개변수를 받아들여, 반환 값이 없습니다.

34ObjLongConsumer<T>

object 타입과 long 타입의 입력 매개변수를 받아 결과를 반환하지 않습니다.

35Predicate<T>

입력 매개변수를 받아 boolean 값을 반환합니다.

36Supplier<T>

매개변수 없이 결과를 반환합니다.

37ToDoubleBiFunction<T,U>

두 입력 매개변수를 받아 double 타입 결과를 반환합니다

38ToDoubleFunction<T>

입력 매개변수를 받아 double 타입 결과를 반환합니다

39ToIntBiFunction<T,U>

두 입력 매개변수를 받아 int 타입 결과를 반환합니다.

40ToIntFunction<T>

입력 매개변수를 받아 int 타입 결과를 반환합니다.

41ToLongBiFunction<T,U>

두 입력 매개변수를 받아 long 타입 결과를 반환합니다.

42ToLongFunction<T>

입력 매개변수를 받아 long 타입 결과를 반환합니다.

43UnaryOperator<T>

매개변수 타입 T를 받고, 반환 타입도 T인 경우

함수형 인터페이스 예제

Predicate <T> 인터페이스는 함수형 인터페이스로, 입력 매개변수 T를 받아布尔 값을 반환합니다.

이 인터페이스는 Predicate를 다른 복잡한 논리(예: AND, OR, NOT)로 조합하는 여러 가지 기본 메서드를 포함하고 있습니다.

이 인터페이스는 객체가 true나 false인지 테스트하는 데 사용됩니다.

다음 예제(Java8Tester.java)에서 함수형 인터페이스 Predicate <T>의 사용을 이해할 수 있습니다:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
 
public class Java8Tester {
   public static void main(String args[]){
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        
      // Predicate<Integer> predicate = n -> true
      // n은 Predicate 인터페이스의 test 메서드에 전달된 매개변수입니다
      // n이 존재하면 test 메서드가 true를 반환합니다
        
      System.out.println("출력 모든 데이터:");
        
      // n 매개변수를 전달합니다
      eval(list, n->true);
        
      // Predicate<Integer> predicate1 = n -> n%2 == 0
      // n은 Predicate 인터페이스의 test 메서드에 전달된 매개변수입니다
      // n%2 0 test 메서드가 true를 반환합니다
        
      System.out.println("출력 모든 짝수:");
      eval(list, n-> n%2 == 0 );
        
      // Predicate<Integer> predicate2 = n -> n > 3
      // n은 Predicate 인터페이스의 test 메서드에 전달된 매개변수입니다
      // n이 더 크다면 3 test 메서드가 true를 반환
        
      System.out.println("출력 값이 큰 3 의 모든 숫자:");
      eval(list, n-> n > 3 );
   }
    
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {
      for(Integer n: list) {
        
         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}

위 스크립트 실행 결과를 출력합니다:

$ javac Java8Tester.java 
$ java Java8Tester
출력 모든 데이터:
1 
2 
3 
4 
5 
6 
7 
8 
9 
출력 모든 짝수:
2 
4 
6 
8 
출력 값이 큰 3 의 모든 숫자:
4 
5 
6 
7 
8 
9

Java 8 새로운 기능