TriFunction Interface in Java – Java中的TriFunction接口

最后修改: 2022年 9月 18日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this article, we’ll define a TriFunction FunctionalInterface that represents a function that accepts three arguments and computes the result. Later on, we’ll also see an example using the built-in Function3 of the Vavr library.

在这篇文章中,我们将定义一个TriFunction FunctionalInterface,表示一个接受三个参数并计算结果的函数。稍后,我们还将看到一个使用Vavr库的内置Function3的例子。

2. Creating Our Own TriFunction Interface

2.创建我们自己的TriFunction接口

Since version 8, Java defines the BiFunction FunctionalInterface. It represents a function that accepts two arguments and computes its result. To allow function composition, it also provides an andThen() method that applies another Function to the result of the BiFunction.

从第8版开始,Java定义了BiFunction FunctionalInterface。它表示一个接受两个参数并计算其结果的函数。为了允许函数组合,它还提供了一个andThen()方法,将另一个Function应用到BiFunction的结果。

Similarly, we’ll define our TriFunction interface and give it the andThen() method:

类似地,我们将定义我们的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));
    }
}

Let’s see how we can use this interface. We’ll define a function that takes three Integers, multiply the two first operands and then add the last operand:

让我们看看如何使用这个接口。我们将定义一个函数,它接收三个Integers,将前两个操作数相乘,然后加上最后一个操作数。

static TriFunction<Integer, Integer, Integer, Integer> multiplyThenAdd = (x, y, z) -> x * y + z;

Let’s note that the result of this method will be accurate only if the product of the two first operands is lower than the Integer maximum value.

让我们注意,只有当两个第一操作数的乘积低于Integer最大值时,这个方法的结果才会准确。

As an example, we can use the andThen() method to define a TriFunction that:

作为一个例子,我们可以使用andThen()方法来定义一个TriFunction,它。

  • first, applies multiplyThenAdd() to the arguments
  • then, applies a Function that computes the quotient of the Euclidian division of an Integer by 10 to the result of the previous step
static TriFunction<Integer, Integer, Integer, Integer> multiplyThenAddThenDivideByTen = multiplyThenAdd.andThen(x -> x / 10);

We can now write some quick tests to check that our TriFunctions behave as expected:

我们现在可以写一些快速测试,以检查我们的TriFunctions的行为是否符合预期。

@Test
void whenMultiplyThenAdd_ThenReturnsCorrectResult() {
    assertEquals(25, multiplyThenAdd.apply(2, 10, 5));
}

@Test
void whenMultiplyThenAddThenDivideByTen_ThenReturnsCorrectResult() {
    assertEquals(2, multiplyThenAddThenDivideByTen.apply(2, 10, 5));
}

As a last note, the operands of the TriFunction can be of various types. For instance, we can define a TriFunction that converts an Integer to a String or returns another given String depending on a Boolean condition:

最后,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. Using Vavr’s Function3

3.使用Vavr的Function3

The Vavr library already defines a Function3 interface that has the behavior we want. First, let’s add the Vavr dependency to our project:

Vavr 库已经定义了一个Function3接口,该接口具有我们想要的行为。首先,让我们将 Vavr 依赖项添加到我们的项目中。

<dependency>
    <groupId>io.vavr</groupId>
    <artifactId>vavr</artifactId>
    <version>0.10.4</version>
</dependency>

We can now redefine the multiplyThenAdd() and multiplyThenAddThenDivideByTen() methods with it:

我们现在可以用它重新定义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);

Using Vavr can be a good choice if we need to define functions with up to 8 arguments. Function4, Function5, Function8 are indeed already defined in the library.

如果我们需要定义多达8个参数的函数,使用Vavr可以是一个不错的选择。Function4, Function5, Function8确实已经在库中定义。

4. Conclusion

4.总结

In this tutorial, we’ve implemented our own FunctionalInterface for a function that accepts 3 arguments. We’ve also highlighted that the Vavr library contains an implementation of this kind of function.

在本教程中,我们为一个接受3个参数的函数实现了自己的FunctionalInterface。我们还强调了Vavr库包含了这种函数的实现。

As always, the code is available over on GitHub.

像往常一样,代码可在GitHub上获得