• java8学习之Function与BiFunction函数式接口详解


    Function接口:

    上次中已经使用了Function的apply()方法,但是在这个接口中还存在三个具体实现的方法,如下:

    下面来仔细的将剩下的方法学习一下:

    compose():

    首先来读一下该方法的javadoc的描述:

    一路读下来貌似还是有点懵,感觉好绕,下面再来看一下它的具体实现,这样可以就容易理解一些:

    说白了,这个方法就是可以组合多个Function,由于该函数最终还是返回的Function,也就是说可以不断的进行多次的compose,了解了方法的说明之后,下面用代码来使用一下它:

    先根据咱们读文档上的描述来分析一下:

    所以,该程序的结果输出应该是12,下面编译运行一下:

    如我们所预期~

    andThen():

    理解了compose()方法,对于这个方法来说就比较容易理解了,跟compose()恰恰相反,也就是先执行当前函数,然后再执行andThen()方法传参的函数,下面也来读一下它的javaDoc:

    下面再来看一下它的具体实现:

    下面再来用代码来使用下,其实是比较好理解的:

    在运行之前,咱们也来先分析一下结果:

    编译运行:

    identity():

    对于这个接口非常简单,看一下javadoc:

    所以这里就不演示了。

    BiFuction接口:

    对于Function函数式接口而言,只有一个输入参数,那如果想传两个参数呢?这时就可以用BiFunction接口啦,其中的Bi是Bidirectional【双向】的简写,下面看一下它的javadoc:

    那怎么使用它呢?试想一下传统方式要实现两数的四则运算会如何去写呢?定义好加减乘除方法,然后分别去调用既可,伪码如下:

    那试想一下,是不是对于两数四则运算的场景刚好满足BiFunction的特性,传递两个参数,最后返回一个值,只是说可能具体的行为需要调用者来传递,这不正好是使用Lambda表达式的用途所在么?所以下面用新的写法来实现两数的四则运算:

    编译运行:

    再一次体现出Lambda表达式传递的是行为,而非值。

    另外再来看一下它有默认方法相比Function接口而言有啥区别:

    关于为什么在BiFunction中少了compose()方法,这个在之后会进行说明,先看一下具体实现:

    由于该方法的javadoc跟Function的andThen说明一样,所以就不细读了,下面直接应用一下:

    同样的在运行之前先来分析一下结果:

    编译运行:

    思考:

    ①、BiFunction相比Function为啥没有compose()方法,而只有andThen()方法呢?

    这里用一个假设法来进行解释,假设BiFunction中有compose()方法,根据Function的compose()方法来看,很明显是需要先执行before函数的,如下:

    当然截图的这是Function.compose()方法原型,要是BiFunction也有compose()方法的话,那这个before参数应该也是BiFunction类型的,但是无所谓,问题的重点是:这两个函数最终执行只能返回一个结果,因为一个方法只能有一个返回值,而执行完before函数之后,接着就要应用到当前的函数上了,还是以Function原型举例:

    而咱们讨论的是BiFunction,那应用它时是需要两个输入参数的,但是before执行完之后只得到了一个结果,那不互相矛盾了么?所以这就是为啥在BiFunction中木有提供compose()方法的原因啦。

    ②、 为啥BiFunction的andThen()方法不是BiFunction类型,而是Function类型呢?

    这个问题在前面也已经抛出来了,其实如果理解了第一个思考问题那对于这个问题比较容易理解,为啥呢?看下具体实现:

    而接着要将这个唯一的返回值要应用到after参数上,因为只有一个参数,所以也只能是用Function,刚好符合Function只有一个参数的语法要求,不可能是用BiFunction。

  • 相关阅读:
    HDU 1257 最少拦截系统(最长递减子序列的条数)
    POJ 2063 Investment 滚动数组+完全背包
    POJ 2392 Space Elevator 贪心+dp
    CodeForces 154A Hometask dp
    CodeForces 57C Array 组合计数+逆元
    hdu 4398 Template Library Management(贪心+stl)
    优先队列详解(转载)
    hdu 4393 Throw nails(优先队列)
    hdu 4022 Bombing(map,multiset)
    hdu 1027 Ignatius and the Princess II(产生第m大的排列,next_permutation函数)
  • 原文地址:https://www.cnblogs.com/webor2006/p/8204591.html
Copyright © 2020-2023  润新知