자바에서 제공하는 함수형 인터페이스 사용 예제를 간단히 살펴보자.
목차는 아래와 같다.
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
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[Java] 가변객체, 불변객체 (1) | 2023.03.30 |
---|---|
[Java] String, StringBuilder, StringBuffer 차이점 (0) | 2023.03.30 |
[JAVA] StringBuilder 메서드 별 간단한 사용 예제 (0) | 2023.03.29 |
[JAVA] 다형성 간단한 예제 및 설명 (0) | 2023.03.03 |
[JAVA] 메소드 레퍼런스 (::사용하는 메소드) (0) | 2023.01.01 |