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。
转载于:https://www.cnblogs.com/webor2006/p/8204591.html
java8学习之Function与BiFunction函数式接口详解相关推荐
- 【java8新特性】——lambda表达式与函数式接口详解(一)
一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...
- Java8中Function函数式接口详解及使用
文章目录 1.函数式接口 1.1允许定义默认方法 1.2允许定义静态方法 1.3允许定义java.lang.Object的public方法 1.4已有函数式接口 2.Function函数 2.1Fun ...
- java函数式接口-详解(狗头保命)
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式. JDK 1.8 之前已有的函数 ...
- java8新特性(3)--- 函数式接口
java8新特性(3)- 函数式接口 有且仅有一个抽象方法 package com.common.jdk8;import java.util.Arrays; import java.util.List ...
- JAVA8学习7-Collector接口详解以及实现类
7 Collector 接口详解(collect 收集器.Collectors)***************** collect: 收集器 Collector 作为 collect 方法的参数 Co ...
- Java8函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- Java 1.8 函数式编程详解
Java 1.8 函数式编程详解 文章目录 Java 1.8 函数式编程详解 一. 概述 1.1 java 8 新特性: 二. 函数式接口 2.1 函数式接口概述 2.2 Lambda表达式概述 2. ...
- JS中函数式编程详解版(FunctionalProgramming,FP)
函数式编程详解 函数式编程的认识 函数式编程前置知识 函数是一等公民(First-class Function) 高阶函数 闭包 函数式编程基础 纯函数 lodash 模块 柯里化 函数组合 函子 函 ...
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...
最新文章
- JAVA关于字符串字符数组处理的小题目
- java冒泡排序_Java算法分析之冒泡排序(Bubble Sort)
- 口语学习Day3:今天聊聊菜单
- 基于hexo搭建个人免费博客——基本设置和了解
- 基本注射/资格赛,范围
- 有关使用seajs和template模板的总结
- original:,tool:AAPT
- 信奥中的数学:微积分 高等数学 数学分析
- linux中安装微信开发者工具
- 要不要升级到iOS16?iOS16有什么缺点?
- DNS地址,DNS服务器作用
- color 常用色值
- linux服务器6t硬盘分区,CentOS分区大于2TB的磁盘以及格式化大于16TB分区的解决方案...
- 美通社企业新闻汇总 | 2019.3.1 | 东京是亚洲商务休闲最佳目的地;贺恩霆担任赛诺菲中国区总裁...
- 视频太大怎么压缩变小?
- Framer X for Mac(交互设计工具)
- 【FXCG】美联储政策上升不确定 美元指数波动加大
- 035 Rust死灵书之Vec处理零尺寸类型
- git克隆代码库时使用指定的用户名密码
- android通知栏自定义软件,android实现通知栏下载更新app示例
热门文章
- MAYA中average normal
- SQLite Tutorial 3 : Working with important SqLite Queries (SELECT, INSERT, DELETE, UPDATE,WHERE...)
- 4复数与复变函数(四)
- ResNet卷积神经网络
- python中while。。。。else的用法
- c语言数组中循坏移动问题,如何将一个数组的元素循环左移?
- 中药说明书实体识别抽取top1
- 什么叫百度下拉框?除了百度下拉还有哪些下拉词框可以优化?
- vsftpd安装配置_CentOS7配置vsftpd虚拟用户模式详解
- java实现工单派发_编写官方微信支付 Java SDK 的同学领下工单!