함수형 인터페이스 (Functional Interface)
- 추상 메서드를 딱 하나만 가지고 있는 인터페이스
- SAM (Single Abstract Method) 인터페이스
- @FunctionalInterface 어노테이션을 가지고 있는 인터페이스
기본 형식 - 만약 여기에 추상 메서드가 하나 추가된다면 함수형 인터페이스가 아니다.
@FunctionalInterface
public interface RunSomething {
int doIt(int number);
}
디폴트 메서드 혹은 static 메서드는 함수형 인터페이스가 맞다.
@FunctionalInterface
public interface RunSomething {
int doIt(int number);
static void printName() {
System.out.println("Junwoo");
}
default void printAge() {
System.out.println("30");
}
}
람다 표현식 (Lambda Expressions)
익명 내부 클래스로부터 람다식으로 변형시킴으로써 코드 라인을 줄일 수 있다.
익명 내부 클래스
RunSomething runSomething2 = new RunSomething() {
@Override
public int doIt(int number) {
return 0;
}
};
람다식 변형
RunSomething runSomething2 = () -> {
System.out.println("Hello!");
System.out.println("Lamda");
};
RunSomething runSomething3 = (number) -> {
return number+10;
};
- 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
- 코드를 줄일 수 있다.
- 메서드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.
자바에서 함수형 프로그래밍
- 함수를 First class object로 사용할 수 있다.
- 순수 함수 (Pure function)
- 사이드 이팩트가 없다. - 입력받은 값이 같은 경우 결과는 항상 같아야 한다.
//결과는 무조건 같아야 한다.
System.out.println(runSomething3.doIt(5));
System.out.println(runSomething3.doIt(5));
System.out.println(runSomething3.doIt(5));
System.out.println(runSomething3.doIt(5));
만약 위의 결과를 보장하지 못한다면 함수형 프로그래밍이라고 볼 수 없다.
- 상태가 없다. (함수 밖에 있는 값을 사용하지 않는다.)
하나 익명 내부 클래스의 변수는 final이라고 가정을 하기 때문에 변경이 불가하다.
- 고차 함수 (Higher-Order Function)
- 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
- 불변성
Code Link
https://github.com/mike6321/PURE_JAVA/tree/master/java8to11/src/main
'Java > Java8' 카테고리의 다른 글
(JAVA8) 람다 표현식과 메서드 래퍼런스 (1) (0) | 2020.07.19 |
---|---|
(JAVA8) 함수형 인터페이스와 람다 표현식 (2) (0) | 2020.07.07 |
(JAVA8) 스트림의 활용 (2) (0) | 2020.01.19 |
(JAVA8) 람다식 (2) (0) | 2020.01.19 |
(JAVA8) 람다식으로 향하는 과정 (0) | 2020.01.16 |