Java函数组合

时间:2020-01-09 10:35:59  来源:igfitidea点击:

函数组合是一种将多个函数组合为单个函数的技术,该函数在内部使用组合的函数。我们可以自己将单个函数(通常是一个或者多个Java Lambda表达式)组合为一个函数,但是Java还内置了对函数组合的内置支持,使工作更轻松。在此Java函数编写教程中,我将说明如何自己通过较小的函数以及通过Java的内置函数来组成函数。

Java函数组合示例

首先,让我向我们展示Java函数组成的示例。这是由其他两个函数组成的单个函数:

Predicate<String> startsWithA = (text) -> text.startsWith("A");
Predicate<String> endsWithX   = (text) -> text.endsWith("x");

Predicate<String> startsWithAAndEndsWithX =
        (text) -> startsWithA.test(text) && endsWithX.test(text);

String  input  = "A hardworking person must relax";
boolean result = startsWithAAndEndsWithX.test(input);
System.out.println(result);

该函数组合示例首先以两个lambda表达式的形式创建两个Predicate实现。如果我们作为参数传递给它的字符串以大写字母a(" A")开头,则第一个"Predicate"将返回" true"。如果传递给它的String以小写字母x结尾,则第二个Predicate返回true。注意,Predicate接口包含一个名为test()的未实现方法,该方法返回一个" boolean"。 lambda表达式实现的正是这种方法。

创建两个基本函数之后,将组成第三个Predicate,它调用两个第一个函数的test()方法。如果两个基本函数都返回" true",则第三个函数返回" true",否则返回" false"。

最后,此示例调用composed函数并打印出结果。由于文本都以大写字母a(" A")开头,并以小写字母x结束,因此,当使用字符串"努力工作的人必须放松"时,组合函数将返回" true"。

Java函数组合支持

上一节中的示例向我们展示了如何从其他两个函数组成一个新函数。 Java中的几个函数接口已经支持内置于其中的函数组合。函数组合支持在函数界面中采用"默认"和"静态"方法的形式。有关接口中的"默认"和"静态"方法的更多信息,请参见我的Java接口教程。

Predicate组合(谓词组合)

"Predicate"接口(" java.util.function.Predicate")包含一些方法,可从其他"Predicate"实例组成新的"Predicate"实例。在以下各节中,我将介绍其中一些方法。

and()

"Predicate"和"()"方法是"默认"方法。 and()方法用于结合其他两个Predicate函数,其函数与本Java函数组成教程开始时所介绍的相同。这是使用Predicate和and()方法的函数组合的示例:

Predicate<String> startsWithA = (text) -> text.startsWith("A");
Predicate<String> endsWithX   = (text) -> text.endsWith("x");

Predicate<String> composed = startsWithA.and(endsWithX);

String input = "A hardworking person must relax";
boolean result = composed.test(input);
System.out.println(result);

这个"Predicate"构成示例使用基本"Predicate"实例之一的"和"方法从另外两个"Predicate"实例中构成了一个新的"Predicate"。

如果由它组成的两个Predicate实例也都返回true,则组成的Predicate将从其test()方法返回true。换句话说,如果"Predicate一"和"Predicate二"都返回true。

or()

Predicate or()方法用于将一个Predicate实例与另一个实例组合在一起,以构成第三个Predicate实例。如果调用的Predicate实例中的任何一个由返回的true组成,则组成的Predicate都将返回true,当调用它们的test()方法的输入参数与组成的Predicate相同时。这是一个JavaPredicateor()`函数组成示例:

Predicate<String> startsWithA = (text) -> text.startsWith("A");
Predicate<String> endsWithX   = (text) -> text.endsWith("x");

Predicate<String> composed = startsWithA.or(endsWithX);

String input = "A hardworking person must relax sometimes";
boolean result = composed.test(input);
System.out.println(result);

这个"Predicate"或者"()"函数组合示例首先创建了两个基本的"Predicate"实例。其次,该示例通过在第一个"Predicate"上调用" or()"方法并将第二个"Predicate"作为参数传递给" or()"方法来创建由前两个组成的第三个"Predicate"。

运行上述示例的输出将为true,因为在用字符串"努力工作的人有时必须放松"时,在组成的Predicate中使用的两个Predicate实例中的第一个将返回true。

函数组合

Java"函数"接口(" java.util.function.Function")还包含一些方法,可用于从现有实例中构成新的" Function"实例。在以下各节中,我将介绍其中一些方法。

compose()

Java Function的compose()方法由调用它的Function实例组成一个新的Function实例,并将Function实例作为参数传递给compose()方法。

由compose()返回的Function将首先调用作为参数传递给compose()的Function,然后再调用调用compose()的Function。用一个示例更容易理解,因此这里是一个JavaFunction``compose()示例:

Function<Integer, Integer> multiply = (value) -> value * 2;
Function<Integer, Integer> add      = (value) -> value + 3;

Function<Integer, Integer> addThenMultiply = multiply.compose(add);

Integer result1 = addThenMultiply.apply(3);
System.out.println(result1);

当使用值" 3"调用时,组成的"函数"将首先调用加法"函数",然后再乘以"函数"。结果计算将为(3 + 3)\ * 2,结果将为12.

andThen()

Java Function和andnn()方法的工作方式与compose()方法相反。由andandn()组成的Function会首先调用调用theAndThen()的Function,然后再调用作为参数传递给andThen()方法的Function。这是一个JavaFunctionandThen()示例:

Function<Integer, Integer> multiply = (value) -> value * 2;
Function<Integer, Integer> add      = (value) -> value + 3;

Function<Integer, Integer> multiplyThenAdd = multiply.andThen(add);

Integer result2 = multiplyThenAdd.apply(3);
System.out.println(result2);

这个例子首先创建一个乘法" Function"和一个加法" Function"。然后在乘法函数上调用andThen()方法以组成一个新的Function函数,并将添加的Function函数作为参数传递给andThen()。

用值3调用由andAndn()组成的Function函数将导致以下计算3 \ * 2 + 3,结果将为9.

注意:如开头所述,andThen()compose()相反。因此,调用a.andThen(b)实际上与调用b.compose(a)相同。