Java函数组合
函数组合是一种将多个函数组合为单个函数的技术,该函数在内部使用组合的函数。我们可以自己将单个函数(通常是一个或者多个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相同时。这是一个JavaPredicate
or()`函数组成示例:
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。这是一个JavaFunction
andThen()示例:
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)
相同。