Java中的TriFunction接口
一、概述
在本文中,我們將定義一個TriFunction
FunctionalInterface
,它表示一個接受三個參數併計算結果的函數。稍後,我們還將看到一個使用 Vavr 庫的內置Function3
的示例。
2. 創建我們自己的TriFunction
接口
從版本 8 開始,Java 定義了BiFunction FunctionalInterface
。它表示一個接受兩個參數併計算其結果的函數。為了允許函數組合,它還提供了一個andThen()
方法,該方法將另一個Function
應用於BiFunction
的結果。
同樣,我們將定義我們的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));
}
}
讓我們看看如何使用這個接口。我們將定義一個接受三個Integers
的函數,將兩個第一個操作數相乘,然後將最後一個操作數相加:
static TriFunction<Integer, Integer, Integer, Integer> multiplyThenAdd = (x, y, z) -> x * y + z;
請注意,只有當兩個第一個操作數的乘積低於Integer
最大值時,此方法的結果才會準確。
例如,我們可以使用andThen()
方法來定義一個TriFunction
:
- 首先,將
multiplyThenAdd()
應用於參數 - 然後,將計算
Integer
歐幾里得除法除以 10 的商的Function
應用於上一步的結果
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
的操作數可以有多種類型。例如,我們可以定義一個TriFunction
,它將Integer
轉換為String
或根據Boolean
條件返回另一個給定的String
:
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的Function3
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 上獲得。