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。

转载于:https://www.cnblogs.com/webor2006/p/8204591.html

java8学习之Function与BiFunction函数式接口详解相关推荐

  1. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  2. Java8中Function函数式接口详解及使用

    文章目录 1.函数式接口 1.1允许定义默认方法 1.2允许定义静态方法 1.3允许定义java.lang.Object的public方法 1.4已有函数式接口 2.Function函数 2.1Fun ...

  3. java函数式接口-详解(狗头保命)

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式. JDK 1.8 之前已有的函数 ...

  4. java8新特性(3)--- 函数式接口

    java8新特性(3)- 函数式接口 有且仅有一个抽象方法 package com.common.jdk8;import java.util.Arrays; import java.util.List ...

  5. JAVA8学习7-Collector接口详解以及实现类

    7 Collector 接口详解(collect 收集器.Collectors)***************** collect: 收集器 Collector 作为 collect 方法的参数 Co ...

  6. Java8函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  7. Java 1.8 函数式编程详解

    Java 1.8 函数式编程详解 文章目录 Java 1.8 函数式编程详解 一. 概述 1.1 java 8 新特性: 二. 函数式接口 2.1 函数式接口概述 2.2 Lambda表达式概述 2. ...

  8. JS中函数式编程详解版(FunctionalProgramming,FP)

    函数式编程详解 函数式编程的认识 函数式编程前置知识 函数是一等公民(First-class Function) 高阶函数 闭包 函数式编程基础 纯函数 lodash 模块 柯里化 函数组合 函子 函 ...

  9. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...

最新文章

  1. JAVA关于字符串字符数组处理的小题目
  2. java冒泡排序_Java算法分析之冒泡排序(Bubble Sort)
  3. 口语学习Day3:今天聊聊菜单
  4. 基于hexo搭建个人免费博客——基本设置和了解
  5. 基本注射/资格赛,范围
  6. 有关使用seajs和template模板的总结
  7. original:,tool:AAPT
  8. 信奥中的数学:微积分 高等数学 数学分析
  9. linux中安装微信开发者工具
  10. 要不要升级到iOS16?iOS16有什么缺点?
  11. DNS地址,DNS服务器作用
  12. color 常用色值
  13. linux服务器6t硬盘分区,CentOS分区大于2TB的磁盘以及格式化大于16TB分区的解决方案...
  14. 美通社企业新闻汇总 | 2019.3.1 | 东京是亚洲商务休闲最佳目的地;贺恩霆担任赛诺菲中国区总裁...
  15. 视频太大怎么压缩变小?
  16. Framer X for Mac(交互设计工具)
  17. 【FXCG】美联储政策上升不确定 美元指数波动加大
  18. 035 Rust死灵书之Vec处理零尺寸类型
  19. git克隆代码库时使用指定的用户名密码
  20. android通知栏自定义软件,android实现通知栏下载更新app示例

热门文章

  1. MAYA中average normal
  2. SQLite Tutorial 3 : Working with important SqLite Queries (SELECT, INSERT, DELETE, UPDATE,WHERE...)
  3. 4复数与复变函数(四)
  4. ResNet卷积神经网络
  5. python中while。。。。else的用法
  6. c语言数组中循坏移动问题,如何将一个数组的元素循环左移?
  7. 中药说明书实体识别抽取top1
  8. 什么叫百度下拉框?除了百度下拉还有哪些下拉词框可以优化?
  9. vsftpd安装配置_CentOS7配置vsftpd虚拟用户模式详解
  10. java实现工单派发_编写官方微信支付 Java SDK 的同学领下工单!