1. 개요
이 기사에서는 세 개의 인수를 받아들이고 결과를 계산하는 함수를 나타내는 TriFunction FunctionalInterface 를 정의합니다. 나중에 Vavr 라이브러리 의 내장 Function3 를 사용하는 예제도 볼 것 입니다.
2. 자체 TriFunction 인터페이스 만들기
버전 8부터 Java는 BiFunction FunctionalInterface 를 정의합니다 . 두 개의 인수를 받아들이고 그 결과를 계산하는 함수를 나타냅니다. 함수 합성을 허용하기 위해 BiFunction 의 결과에 다른 함수를 적용하는 andThen ( ) 메서드 도 제공 합니다 .
마찬가지로 TriFunction 인터페이스를 정의하고 andThen() 메서드를 제공합니다.
@FunctionalInterface
public interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
default <K> TriFunction<T, U, V, K> andThen(Function<? super R, ? extends K> after) {
Objects.requireNonNull(after);
return (T t, U u, V v) -> after.apply(apply(t, u, v));
}
}
이 인터페이스를 어떻게 사용할 수 있는지 봅시다. 3개의 Integers 를 사용하는 함수를 정의 하고 두 개의 첫 번째 피연산자를 곱한 다음 마지막 피연산자를 추가합니다.
static TriFunction<Integer, Integer, Integer, Integer> multiplyThenAdd = (x, y, z) -> x * y + z;
이 방법의 결과는 두 개의 첫 번째 피연산자의 곱이 Integer 최대값 보다 작은 경우에만 정확하다는 점에 유의하십시오 .
예를 들어 andThen() 메서드를 사용하여 다음과 같은 TriFunction 을 정의할 수 있습니다 .
- 먼저, 인수에 multipleThenAdd() 를 적용합니다.
- 그런 다음 이전 단계의 결과에 정수 의 유클리드 나눗셈의 몫을 10으로 계산 하는 함수 를 적용합니다.
static TriFunction<Integer, Integer, Integer, Integer> multiplyThenAddThenDivideByTen = multiplyThenAdd.andThen(x -> x / 10);
이제 TriFunction 이 예상대로 작동하는지 확인하기 위해 몇 가지 빠른 테스트를 작성할 수 있습니다.
@Test
void whenMultiplyThenAdd_ThenReturnsCorrectResult() {
assertEquals(25, multiplyThenAdd.apply(2, 10, 5));
}
@Test
void whenMultiplyThenAddThenDivideByTen_ThenReturnsCorrectResult() {
assertEquals(2, multiplyThenAddThenDivideByTen.apply(2, 10, 5));
}
마지막으로 TriFunction 의 피연산자 는 다양한 유형이 될 수 있습니다. 예를 들어 Boolean 조건 에 따라 Integer 를 String 으로 변환 하거나 주어진 다른 String을 반환 하는 TriFunction 을 정의할 수 있습니다.
static TriFunction<Integer, String, Boolean, String> convertIntegerOrReturnStringDependingOnCondition = (myInt, myStr, myBool) -> {
if (Boolean.TRUE.equals(myBool)) {
return myInt != null ? myInt.toString() : "";
} else {
return myStr;
}
};
3. Vavr의 기능 사용3
Vavr 라이브러리는 우리가 원하는 동작을 가진 Function3 인터페이스를 이미 정의하고 있습니다. 먼저 프로젝트 에 Vavr 의존성 을 추가해 보겠습니다 .
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.10.4</version>
</dependency>
이제 다음 과 같이 multiplyThenAdd() 및 multiplyThenAddThenDivideByTen() 메서드를 재정의할 수 있습니다.
static Function3<Integer, Integer, Integer, Integer> multiplyThenAdd = (x, y, z) -> x * y + z;
static Function3<Integer, Integer, Integer, Integer> multiplyThenAddThenDivideByTen = multiplyThenAdd.andThen(x -> x / 10);
최대 8개의 인수로 함수를 정의해야 하는 경우 Vavr을 사용하는 것이 좋습니다. Function4 , Function5, ... Function8 은 실제로 라이브러리에 이미 정의되어 있습니다.
4. 결론
이 사용방법(예제)에서는 3개의 인수를 허용하는 함수에 대해 자체 FunctionalInterface 를 구현했습니다. 우리는 또한 Vavr 라이브러리에 이러한 종류의 기능 구현이 포함되어 있다는 점을 강조했습니다.
항상 그렇듯이 코드는 GitHub 에서 사용할 수 있습니다 .