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而生。
Java8函数式编程(A)的更多相关文章
- 关于Java8函数式编程你需要了解的几点
函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...
- [2017.02.23] Java8 函数式编程
以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- 漫漫人生路,学点Jakarta基础-Java8函数式编程
接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...
- Java8函数式编程的宏观总结
1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...
- java8函数式编程实例
什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- 重识Java8函数式编程
前言 最近真的是太忙忙忙忙忙了,很久没有更新文章了.最近工作中看到了几段关于函数式编程的代码,但是有点费解,于是就准备总结一下函数式编程.很多东西很简单,但是如果不总结,可能会被它的各种变体所困扰.接 ...
随机推荐
- 添加weui-miniprogram
1.打开根目录 npm init npm install weui-miniprogram --save 2.打开project.config.json 设置 "packNpmManuall ...
- vue项目引用vue-pdf打包多出worker.js文件
问题描述:项目要用到pdf预览功能,因为是vue项目就是直接导入了vue-pdf组件,但是在进行打包的时候在dist文件夹下面多个worker.js文件,导致项目部署后预览pdf直接报了404 方案一 ...
- VUE学习-自定义指令
自定义指令 有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令. <div id="directive-demo"> <input ...
- linux下启动jar包
一.jdk 1.安装jdk 2.查看 摘自:(29条消息) Linux如何查看JDK的安装路径_fanyuna的博客-CSDN博客_linux查看jdk安装位置 1:echo $JAVA_HOME 使 ...
- Launchpad是什么?Launchpad使用教程
Launchpad是什么?Launchpad 是用来查找和打开Mac系统下的 app 的最快捷方式,通过 Launchpad,您可以查看.整理并轻松打开Mac里面几乎所有的应用软件.下面带来Mac ...
- js 加密和解密
// aes对称加密 const CryptoJS = require('crypto-js'); //引用AES源码js const key = CryptoJS.enc.Utf8.parse(&q ...
- React.CreateContext
跨组件传递的内容组件,该组件导出两个对象Provider 提供数据, Consumer, 消费数据 Context被翻译为上下文,在React的官方文档中归类于高级部分,属于React的高级API,但 ...
- maven学习记录:命令行查看本地仓库所在位置
命令行 mvn help:effective-settings 查看localRepository的的位置
- pure-ftpd(源码编译)中文编码问题
1.由于版本问题,该软件有些版本不能编译--with-rfc2640选项.解决办法为换成相应低一点的版本 tar -xf pure-ftpd-1.0.42.tar.gz cd pure-ftpd-1. ...
- 关于 MySQL 的 General Log 功能
检查 General Log 输出目标 SHOW GLOBAL VARIABLES LIKE 'log_output'; # Type: Set # Default Value: FILE # Val ...