함수형 인터페이스란
- 아래와 같이 추상 메소드를 딱 하나만 가지고 있는 인터페이스
public interface RunSomething {
void doIt(); // abstract 가 생략된 것이다.
}
static void printName(){
System.out.println("이름");
}
default void printAge(){
System.out.println("28");
}
- static 메소드나 default 메소드의 유무와는 상관없이
추상메서드가 1개이면 함수형 인터페이스
이다.
- SAM (Single Abstract Method) 인터페이스
@FuncationInterface
애노테이션을 가지고 있는 인터페이스
람다 표현식
- 위에서 정의한 RunSomething 인터페이스를 람다를 사용하지 않으면 아래와 같이 사용해야한다.
RunSomething runsomething = new RunSomething() {
@Override
public void doIt() {
System.out.println("Hello");
}
};
RunSomething runSomething = () -> System.out.println("Hello");
- 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
- 코드를 줄일 수 있다.
- 메소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.
자바에서 함수형 프로그래밍 특징
- 함수를 First class object로 사용할 수 있다. (함수를 Object 변수형태로 사용할 수 있다.)
- 순수 함수 (Pure function)
- 사이드 이팩트가 없다. (
함수 밖에 있는 값을 변경하지 않는다.
)
- 상태가 없다. (
함수 밖에 있는 값을 사용하지 않는다.
)
- 고차 함수 (Higher-Order Function)
- 함수가 함수를
매개변수
로 받을 수 있고 함수를 리턴
할 수도 있다.
- 불변성
Java가 기본으로 제공하는 함수형 인터페이스
- 자바에서 미리 정의해둔 자주 사용할만한 함수 인터페이스다.
Function<T, R>
- T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스
- 구현 방법
public class Plus10 implements Function<Integer, Integer> {
@Override
public Integer apply(Integer Integer) {
return integer + 10;
}
}
public static void main(String[] args){
Plus10 plus10 = new Plus10();
System.out.println(plus10.apply(1));
}
- 람다 사용 -> 클래스를 구현할 필요없다.
public static void main(String[] args){
Function<Integer, Integer> plus10 = (i) -> i + 10;
System.out.println(plus10.apply(1));
}
public static void main(String[] args){
Function<Integer, Integer> plus10 = (i) -> i + 10;
Function<Integer, Integer> multi2 = (i) -> i * 2;
plus10.compose(multi2).apply(2); // 2를 곱하고 10을 더한다
plus10.andThen(multi2).apply(2); // 10에 2를 더하고 2를 곱한다.
}
- andThen
- compose
BiFunction<T, U, R>
- 두 개의 값(T, U)를 받아서 R 타입을 리턴하는 함수 인터페이스
Consumer
- T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
- 함수 조합용 메소드
- ex> -> 출력만 해주는 함수
Consumer<Integer> printT = (i) -> System.out.println(i);
printT.accept(10);
Supplier
- T 타입의 값을 제공하는 함수 인터페이스
- ex>
Supplier<Integer> get10 = () -> 10;
get10.get();
Predicate
- T 타입을 받아서 boolean을 리턴하는 함수 인터페이스
- 함수 조합용 메소드
- ex>
Predicate<String> str = (s) -> s.startsWith("one");
str.test("one two")
- "one" 으로 시작하기 때문에 true가 반환된다.
UnaryOperator
- Function<T, R>의 특수한 형태로, 입력값과 리턴값의 타입이 동일한 경우
Function<Integer, Integer> plus10 = (i) -> i + 10;
UnaryOperator<Integer> plus10 = (i) -> i + 10;
BinaryOperator
- BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입렵값 두개를 받아 리턴하는 함수 인터페이스
- BiFunction<T, T, T>와 같다.
REFERENCES