Java8函数式编程(A)
将行为作为数据传递
函数编程的最直接的表现,莫过于将函数作为数据自由传递,结合泛型推导能力,使代码表达能力获得飞一般的提升。
Java8怎么支持函数式编程? 主要有三个核心概念:
- 函数接口(Function)
- 流(Stream)
- 聚合器(Collector)
函数接口
关于函数接口,两件事:
- 函数接口是行为的抽象
- 函数接口是数据转换器
java.util.Function包,定义了四个最基础的函数接口:
- Supplier
数据转换器,可以提供T类型对象;无参的构造器,提供了get方法
- Function
数据转换器,接收一个T类型的对象,返回一个R类型的对象;单参数单返回值的行为接口;提供了apply,compose,andThen,identity方法;
- Consumer
数据消费器,接收一个T类型的对象,无返回值,通常用于根据T对象做些处理;单参数无返回值的行为接口;提供了accept,andThen方法;
- Predicate
条件测试器,接收一个T类型的对象,返回布尔值,通常用于传递条件函数;单参数布尔值的条件性接口;提供了test(条件测试),and-or-negate(与或非)方法。
其中,compose,andThen,and,or,negate用来组合函数接口而得到更强大的函数接口。
聚合器
每一个流式计算的末尾总有一个类似collect(Collectors.toList())的方法调用。collect是Stream的方法,而参数则是聚合器Collector. 已有的聚合器定义在Collectors的静态方法里。那么这个聚合器怎么实现呢?
Reduce
大部分聚合器都是基于Reduce操作实现的。Reduce, 即推导。含有三个要素:初始值init, 二元操作符BinaryOperator,以及一个用于聚合结果的数据源S.
列表类聚合器
1. 使用ArrayList::new 创建一个空列表;
2.List::add 将Stream累积操作的中间结果加入到这个列表
3. 第三个函数则是将两个列表元素进行合并成一个结果列表中。
实例:集合聚合器toList、toSet 字符串连接器joining(),以及列表求和summingXXX、最多maxBy、最小minby
映射类聚合器
映射类聚合器基于Map合并来完成。
根据指定的值合并函数mergeFunction, 返回一个map合并器,用来合并两个map里相同key的值。mergeFunction用来对两个map中相同key的值进行运算得到新的value值,如果value值为null,会移除相应的key,否则使用value值作为对应key的值。
这个方法私有的,主要为支撑toMap,groupingBy而生。
最新文章
- XCode 中的代码块导出与导入
- Qt编写自定义控件二动画按钮
- [转]关于负margin在页面中布局的应用
- LR调用DLL(加密测试等)
- Java琐记
- 整理Ruby相关的各种概念(rvm, gem, bundle, rake, rails等)
- 各浏览器的cookie的name个数/最大容量限制测试
- Linux入门(三)搭建服务器linux运行环境LAMP/LNMP
- 常见浏览器User-Agent大全
- Dynamics CRM2016 Web API之删除单个查找字段值
- python之路-数据运算
- Discrete Logging ZOJ - 1898 (模板题大小步算法)
- php面向对象的封装性
- Freemarker入门
- linux 中的定时任务crontab使用方法
- cookie和session 区别
- ktime使用例子【原创】
- centos7 docker镜像加速器配置
- DEDE利用Ajax实现调用当前登录会员的信息简要说明
- WebRTC协议
热门文章
- java语言——跨平台原理,jre,jdk
- JavaScript类
- java学习日记20230302-字符
- ubuntu22.04 git升级
- Word12 财务部制作本年年度报告office真题
- [Python灰帽子-黑客与逆向工程师的Python编程之道]书籍
- vscode 中用git命令合并分支
- 02_IntelliJ IDEA常用快捷键
- Redis Stack(生产适配-仅提供 Redis Stack 服务器) (6.2.4-v2版本)
- SAR成像(六):距离徙动矫正