BiFunction界面中的默认andThen()方法

时间:2018-04-28 08:45:10

标签: java java-8 function-composition

andThen()界面(BiFunction包)中有一个默认方法java.util.function

default <V> BiFunction<T,U,V> andThen(Function<? super R,? extends V> after)

文档说:

  

返回一个组合函数,该函数首先将此函数应用于其输入,然后将after函数应用于结果。如果对任一函数的求值抛出异常,则将其转发给组合函数的调用者。

理解解释的含义并不容易让人困惑。根据我的理解,当调用默认的andThen()方法时,将返回一个组合函数。在返回类型T的类型UV上调用此组合函数。最后,在类型afterR上调用了V函数。

这种方法有什么需要?它实际上如何适应图片?

4 个答案:

答案 0 :(得分:2)

考虑f1.andThen(f2)

  1. 首先,f1将占用2个元素,结果只有1个
  2. 之后,f2将获取f1的结果并将其转换为其他结果
  3. BiFunction<Integer, Integer, Integer> plus10 = (i1, i2) -> i1 + i2 + 10;
    
    Function<Integer, Integer> mult = i -> i * 5;
    
    System.out.println(plus10.andThen(mult).apply(5, 6)); // (5+6+10) *5 = 105
    

    这是一种减少计算的方法

    int val1 = plus10.apply(5, 6);
    int res1 = mult.apply(val1);
    
    int res2 = plus10.andThen(mult).apply(5, 6);
    System.out.println(res1 == res2);            //true
    

    当您使用多个功能时,它会越来越有用,因为methodFunction个相同的内容,因此您可以链接它们:

    System.out.println(plus10.andThen(mult).andThen(mult).andThen(mult).apply(5, 6)); 
    // (5+6+10)*5*5*5 = 2625
    

答案 1 :(得分:2)

  

理解解释的含义会让人感到困惑。

为了解释它尽可能简单,方法andThen返回一个函数,该函数首先将给定函数应用于输入,然后将另一个函数应用于该应用程序的结果。

假设我们有两个函数fg,函数f执行某些逻辑和函数g执行其他类型的逻辑,因此当您撰写{{1}时这基本上意味着f.andThen(g),即我们首先应用作为参数g(f(x))给出的函数,然后将函数f(x)应用于结果。

示例:

g

我们首先调用函数BiFunction<Integer, Integer, Integer> f = Math::addExact; Function<Integer, Integer> g = e -> e * 2; System.out.println(f.andThen(g).apply(10,10)); // 40 ,然后获取f(10, 10)的结果,将其传递给函数20,并执行g(20)乘以{{ 1}}因此产生20

老实说,在2中调用函数的语法并不是最好的,所以我可以理解当有人第一次看到它时可能很难掌握并且更难以遵循更多你编写函数,例如在40中,你可以简单地做Java,这对于眼睛来说更容易理解,阅读和理解。

  

这种方法需要什么?它是如何真正适合的   图片?

根据我的经验,我已经编写了如上所示的函数并不常见,但我能想象的一个典型场景是,如果你有各种实用方法可以做一些逻辑,其中一个函数的结果是进一步传递给其他函数进行处理,在这种情况下,您可以使用函数组合通过组合实用程序方法来创建各种转换管道。

答案 2 :(得分:1)

我认为andThen函数的主要目的是使代码更具可读性和功能性。

让我们看看并举例:

BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;
Function<Integer, Integer> negate = x -> -x;
BiFunction<Integer, Integer, Integer> newFunction = add.andThen(negate);

猜猜newFunction做了什么?它添加 然后 否定两个数字!看看这行与英语有多相似:

BiFunction<Integer, Integer, Integer> newFunction = add.andThen(negate);

如果您致电.apply(1, 2),您就知道自己获得了-3。

当然,您可以在不使用andThen的情况下执行此操作:

BiFunction<Integer, Integer, Integer> newFunction = (x, y) -> negate.apply(add.apply(x, y))

但看看它有多难以理解!

在功能上编码有时可以使事情更容易阅读和理解。

答案 3 :(得分:0)

通过示例更容易理解:

BiFunction<Integer, Integer, String> f = 
        (n1, n2) -> String.format("result is %s", n1+n2);

&#34;组成功能&#34;是:

BiFunction<Integer, Integer, String> f1 = 
        f.andThen(string -> string.toUpperCase());

请注意,第二个函数仍然采用与第一个函数相同的参数类型,尽管它在内部只需要一个String来执行其逻辑。

考虑调用:

System.out.println(f1.apply(2, 3));

输出RESULT IS 5,即:它调用第一个函数,然后使用第一个函数调用第二个函数。因此,它被简单地理解为f1(f(x, y)),最终输入是f所需的输入,最终结果是f1产生的结果。