Java函数式编程教程(四):Java函数式组合

翻译:GentlemanTsao,2020-6-27


函数式组合是一种将多个函数组合为单个函数的技术,该函数在内部使用组合函数。 你可以自己将单个函数(通常是一个或多个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开头,则第一个Predicate将返回true。 如果传递给它的字符串以小写字母x结尾,则第二个Predicate返回true。 请注意,Predicate接口包含一个名为test()的未实现方法,该方法返回boolean。 lambda表达式实现的正是这个方法。

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

最后,此示例调用组合函数并打印出结果。 由于文本均以大写字母A开头,以小写字母x结尾,因此,当使用字符串“A hardworking person must relax”进行调用时,组合函数将返回true。

Java对函数式组合的支持

上一节中的示例展示了如何用两个函数组成一个新函数。 Java中的几个函数式接口已经支持内置于其中的函数式组合。 函数式组合通过函数式接口中的默认方法和静态方法的形式予以支持。

Predicate组合

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

and()

Predicate的and()方法是默认方法。 and()方法用于组合其他两个Predicate函数,其方式与本教程开始时所介绍的相同。 如下是使用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实例的and()方法从其他两个Predicate实例构成一个新的Predicate。

如果Predicate 1和Predicate 2都返回true,则组成的Predicate的test()方法返回true。

or()

Predicate or()方法用于将一个Predicate实例与另一个Predicate组合在一起,以构成第三个谓Predicate实例。 如果组成Predicate中的任何一个返回true,则组合Predicate将返回true。 如下是一个Java Predicate 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);

Function组合

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

compose()

Java Function compose()方法从调用它的Function实例组成一个新的Function实例,compose()方法的参数也是Function实例。

由compose()返回的Function将首先调用作为compose()参数的Function,然后再调用compose()所在的Function。 通过一个示例更容易理解,如下是一个Java Function 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,组合Function将首先调用加法Function,然后是乘法Function。 结果计算将为(3 + 3)* 2,结果将为12。

andThen()

Java Function andThen()方法与compose()方法相反。 由andThen()组成的函数将首先调用andThen()上的函数,然后再调用作为andThen()参数的函数。 这是一个Java函数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。 然后在乘法Function上调用andThen()方法以组成一个新Function,并将加法Function作为参数传递给andThen()。

以参数3调用由andThen()组成的函数将得到以下计算
3 * 2 + 3,结果将为9。

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

下一篇:
Java函数式编程教程(五):Java Steam API

猜你喜欢

转载自blog.csdn.net/GentelmanTsao/article/details/106929083