将行为作为数据传递

函数编程的最直接的表现,莫过于将函数作为数据自由传递,结合泛型推导能力,使代码表达能力获得飞一般的提升。

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)的更多相关文章

  1. 关于Java8函数式编程你需要了解的几点

    函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...

  2. Java8 函数式编程详解

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

  3. Java8函数式编程探秘

    引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...

  4. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  5. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  6. 漫漫人生路,学点Jakarta基础-Java8函数式编程

    接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...

  7. Java8函数式编程的宏观总结

    1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...

  8. java8函数式编程实例

    什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...

  9. Java8函数式编程以及Lambda表达式

    第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...

  10. 重识Java8函数式编程

    前言 最近真的是太忙忙忙忙忙了,很久没有更新文章了.最近工作中看到了几段关于函数式编程的代码,但是有点费解,于是就准备总结一下函数式编程.很多东西很简单,但是如果不总结,可能会被它的各种变体所困扰.接 ...

随机推荐

  1. GPS地图生成02之经典算法体验

    经典的利用轨迹生成地图的算法与数据集可寻找于:Mapconstruction by pfoser Mapconstruction by pfoser数据集中,雅典数据集投影坐标系为(UTM, GGRS ...

  2. 在Django中显示MySQL语句

    在setting中添加以下内容 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console' ...

  3. Truenas core 13连接LDAP,获取AD域用户及自动分配权限---chatGPT回复,未做证实

    要在TrueNAS Core 13上连接LDAP并从AD域中获取用户,请按照以下步骤操作: 在TrueNAS Core 13上登录到WebUI. 转到"网络"菜单并选择" ...

  4. DataTransfer.setDragImage()自定义拖拽图像遇到的坑

    发生拖动时,从拖动目标(dragstart事件触发的元素)生成半透明图像,并在拖动过程中跟随鼠标指针.这个图片是自动创建的,你不需要自己去创建它.然而,如果想要设置为自定义图像,那么 DataTran ...

  5. djangoDRF查询

    DRF全部查询基础示例 from django.db.models import Q, F, Sum, Avg, Count, Min, Max from rest_framework.respons ...

  6. c++ class派生与多态

    目录 类继承和类派生 继承时名字遮蔽 基类和派生类的构造函数 构造函数调用顺序 基类和派生类的析构函数 多重继承 虚继承和虚基类 将派生类赋值给基类(向上转型) 将派生类指针赋值给基类指针. 将派生类 ...

  7. 04_Linux完全卸载安装Mysql

    1.Linux环境完全卸载mysql相关文件: 完全卸载mysql相关文件:             yum remove mysql mysql-server mysql-libs compat-m ...

  8. [PHP]流程控制的替代语法:endif/endwhile/endfor使用介绍

    我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: 代码如下: <?php if(empty($GET_['a'])): ?> <font color ...

  9. linux启用ipv4转发功能

    一.临时生效,重启失效1.sysctl -w net.ipv4.ip_forward=12.echo 1 > /proc/sys/net/ipv4/ip_forward二.永久生效修改 /etc ...

  10. 【Frida】Java反射调用

    通过反射调用,获取类名 参数Object obj 类名 String str 方法名 static Object a(Object obj, String str) { try { return ob ...