프로그래밍언어/JAVA

[JAVA] Functional Interface 함수형 인터페이스

shoney9254 2023. 1. 2. 23:27
반응형

자바에서 제공하는 함수형 인터페이스 사용 예제를 간단히 살펴보자. 

 

목차는 아래와 같다.

1. Function<T, R>

2. BiFunction<T, U, R>

3. Consumer<T>

4. Supplier<T>

5. Predicate<T>

6. UnaryOperator<T>

7. BinaryOperator<T>


 

1. Function<T, R>

- T타입을 받아서 R타입을 반환하는 함수 인터페이스

- .apply(T t) 방식으로 사용할 수 있다. 

- 함수 조합용 메소드로 andThen, compose 함수가 있다.

 

1-1. 먼저 인터페이스를 상속 받아서 사용

- Function 인터페이스를 상속 받아서 apply를 아래와 같이 구현하면 된다.

public class Plus10 implements Function<Integer,Integer> {

    @Override
    public Integer apply(Integer integer) {
        return integer + 10;
    }
}

그리고 실행할 위치에서 apply메소드로 실행하면 작동하는 것을 확인할 수 있다. 

// 1.function 을 상속 받아서 사용하는 법
Plus10 plus10 = new Plus10();
System.out.println(plus10.apply(1));

결과 

11

 

1-2. 람다식을 사용해서 바로 구현

- Function을 먼저 선언한 뒤, 람다식으로 표현하면 구현할 수 있다.

// 2. 위 내용과 같은 방법
Function<Integer, Integer> plus10Lamda = (num) -> num + 10;
Function<Integer, Integer> multiplyLamda = (num) -> num * 2;
System.out.println(plus10Lamda.apply(1));
System.out.println(multiplyLamda.apply(2));

결과 

11
4

 

1-3.  Compose 사용

- A.compose(B) : B 수행한 결과를 가지고 A 수행

// 3. A.compose(B) : B 먼저하고 A 하도록 함
Function<Integer, Integer> multiplyAndPlus10 = plus10Lamda.compose(multiplyLamda);
Function<Integer, Integer> plus10AndMultiply = multiplyLamda.compose(plus10Lamda);
System.out.println("compose *2+10 : "+multiplyAndPlus10.apply(2));
System.out.println("compose +10*2 : "+plus10AndMultiply.apply(2));

결과

compose *2+10 : 14
compose +10*2 : 24

 

1-4. AndThen 사용

- A.andThen(B) : A 수행한 결과를 가지고 B 수행

// 4. A.andThen(B) : A하고 B 하도록 함
System.out.println(plus10Lamda.andThen(multiplyLamda).apply(2));

결과 

24


 

2. BiFunction<T, U, R>

- Function과 사용방법은 같지만, 두개의 인자값(T, U)를 받아서 R을 반환하는 함수 인터페이스

// Function과 사용방법 동일
BiFunction<String, String, String> biFunction = (a, b) -> a + b + " BiFunction";
System.out.println(biFunction.apply("StringA", " StringB"));

결과 

StringA StringB BiFunction

 


 

3. Consumer<T>

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

- .Accept(T t) 방식으로 사용

// Consumer : return 값이 없는 void 함수라고 보면된다.
Consumer<Integer> printT = (i) -> System.out.println("consumer : "+i);
printT.accept(10);

결과 

consumer : 10


 

4. Supplier<T>

- T타입 리턴만 하는 함수 인터페이스

- .get()로 사용

// Supplier : return 값만 있는 함수, 인자가 없음
Supplier<Integer> get10 = () -> 10;
System.out.println(get10.get());

결과

10


5. Predicate<T>

- T타입을 받아서 boolean을 반환하는 함수 인터페이스

- .test(T t)로 사용

// Predicate : boolean 반환
Predicate<String> startsWithshoney = (s) -> s.startsWith("sho");
Predicate<Integer> isEven = (s) -> s % 2 == 0;
System.out.println(startsWithshoney.test("shoney"));
System.out.println(isEven.test(3));

결과

true
false


6. UnaryOperator<T>

- Function이랑 같은데, 인자와 반환 타입이 T로 동일한 경우 사용

// UnaryOperator : Function을 상속받아서 만드는 앤데 인자와 리턴 포맷이 같은 경우 사용
UnaryOperator<Integer> unaryOperator = (num) -> num + 12;
System.out.println(unaryOperator.apply(3));

결과

15


7. BinaryOperator<T>

- 2개의 인자 타입과 1개의 반환 타입이 같은 경우에 사용

// BinaryOperator : 입력값 2개를 받아서 리턴하는 함수
BinaryOperator<Integer> binaryOperator = (a, b) -> a + b + 100;
System.out.println(binaryOperator.apply(3,4));

결과

107

반응형