java函数式编程之Collector、Optional、CompletableFuture详解

1. Stream.collect()

collect就是一个归约操作,就像reduce一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果

reduce不会修改累计值对象,而是直接把累计值和当前值做计算操作,产生一个新累计值对象传递下去,而collect每次都会做完操作后修改累计值对象,并把这个累计值对象传递下去,如下图,collect的累计值是一个Container,每次都把当前元素做完操作后,存入Container,并让Container一直往下传递,最后所有的结果都会汇总到Container中

1.3.1 Supplier

用于提供一个累计容器,也就是上图中用于存储元素的Container,通过调用Supplier的get方法得到

1.3.2 Accumulator

用于提供累计函数,即给定累计值和当前值的操作关系

1.3.3 Combiner

用于给定容器合并的规则

Collector就是把collect()方法中需要的函数封装成一个对象

Supplier: 累积数据构造函数

Accumulator: 累积函数,同 reduce

Combiner: 合并函数 ,并行处理场合下用,同 reduce

Finisher: 对 累积数据 做最终 转换

Collectors类就提供了一些api来创建Collector,如我们常用的toList源码如下

可以看出来返回的这个Collector的Supplier是ArrayList::new,accumulator是List::add,combiner是(left, right) -> { left.addAll(right); return left; },没有finisher

把结果归集为一个集合

counting:统计计数

averagingLong/int/Double:求平均

SummarizingDouble/Long/Int

为stream中的元素生成了统计信息,返回的结果是一个统计类

对流中的内元素进行分组

  • groupingBy(Function) – 单纯分key存放成Map,默认返回HashMap
  • groupingBy(Function, Collector) – 分key后,对每个key的元素进行后续collect操作
  • groupingBy(Function, Suppiler, Collector) – 同上,允许通过Suppiler传入其他Map类型

downstream操作:可以嵌套多层Collector,如下,分组完之后还可以传入Collector无限操作

partitioningBy:按条件分成true和false两部分

mapping的功能上和stream.map差不多,但是这个支持downstream,也就是支持映射之后,做进一步操作

reducing:对结果进行归集操作

函数组合就是把多个函数组合成一个函数来执行

先执行andThen前面的函数,再执行后面的函数,相当于数学表达式:f1.andThen(f2) = f2(f1());

先执行后面的函数,再执行前面的函数,相当于数学表达式:f1.compose(f2) = f1(f2());

Optional是java8引入的一个用于解决空指针异常的类,相当于用Optional把对象包装起来,每次都只针对Optional进行操作,这样就能避免空指针异常的出现;

没有Optional之前我们要一层一层判空

有了Optional之后,中间任意一层都可以为空

创建一个空的Optional对象,看源码

不允许传入null对象,否则会报空指针,应该明确对象不为null的时候才使用

允许传入null对象

ofNullable源码可以看到如果传入null,会自动创建一个空的Optional对象

可以取回对象实际值,值为null 的时候抛出异常,所以建议配合下面几个api一起用

if x!= null return x else return T:如果实际值不为空,则返回实际值,否则返回orElse()方法中给定的值

if x!=null return x else return fn:如果值不为空则返回实际值,否则返回函数fn的执行结果

如果实际值为空,则orElse和orElseGet效果差不多,但是如果实际值不为空,虽然都能获取到实际值,但是orElse中的调用还是会执行,而orElseGet的不会执行,所以建议用orElseGet,减少不必要的代码执行,提升性能

if x!= null fn:如果实际值不为空,则执行fn函数

isPresent():判断实际值是否为空

跟stream的map效果差不多也是可以对内容做映射操作

如果一个对象某个成员属性本身是Optional类型的,可能会出现Optional嵌套情况

如果想获取到真实的Pet,需要用flatMap解掉一层Optional

Future接口可以构建异步应用,但依然有其局限性。它很难直接表述多个Future 结果之间的依赖性,CompletableFuture正好可以满足这个要求,如何对两个或多个异步操作进行流水线和合并操作;

由于api非常多,可以通过以下方式来理解api的作用

  • accept: 接受参数是 Consumer
  • apply: 接受参数是 Function
  • handle:接受参数是BiFunction
  • runAfter : 接受参数是Runnable
  • Either/Both: 任一任务完成还是都完成
  • then: 等当前任务完成再执行另一个
  • async 后续任务是否异步执行

假如需要完成以下的几个异步调用:

service2依赖于service1的执行结果,service4依赖于service2和service3的执行结果

用传统的Future实现方式:

CompletableFuture实现方式:

Original: https://www.cnblogs.com/jiqirenweb/p/16098702.html
Author: 花好月圆梦
Title: java函数式编程之Collector、Optional、CompletableFuture详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594084/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Elasticsearch索引生命周期管理方案

    一、前言 在 Elasticsearch 的日常中,有很多如存储 系统日志、 行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索&…

    Java 2023年6月6日
    085
  • 2>&1到底是什么意思?

    java -jar snapshot.jar > snapshot.log 2>&1 & 写Java的朋友一定对上面的命令很熟悉,相信大部分人都知道 &…

    Java 2023年6月7日
    071
  • 2021网络协议从入门到底层原理1《小码哥》

    物理层 网络互连模型 网络互连模型◼为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 在 1985 年制定了网络互连模型 OSI 参考模型(Open System Int…

    Java 2023年6月7日
    060
  • springboot系列十三、springboot集成swaggerUI

    一、Swagger介绍 Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速…

    Java 2023年5月30日
    075
  • 如何搭建一个WEB服务器项目(三)—— 实现安卓端联网登录

    安卓端调用服务器登录函数进行验证登录 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟。欢迎各位大佬来评论区提出问题或者是指…

    Java 2023年6月8日
    099
  • MyBatis的基本介绍及优势

    MyBatis 的历史由来 Mybatis 原本是 Apache 软件基金会的一个开源项目叫做 iBatis ,2010 年这个项目由 Apache 迁移到了 google cod…

    Java 2023年6月5日
    087
  • 软件工程第一周开课博客

    我是石家庄铁道大学信息科学技术学院软件工程系信2005-3班的陈振辉,学号20203910 学习现状:大学以来一直浑浑噩噩,几乎所有的必修科目都是擦边过的,这完全靠老师们的努力,将…

    Java 2023年6月9日
    071
  • 检查点

    检查点 Checkpoint 概念: 背&amp…

    Java 2023年6月9日
    0112
  • 常用的线程池介绍

    线程池: 简介:线程池是用来统一管理线程的,在 Java 中创建和销毁线程都是一件消耗资源的事情,线程池可以重复使用线程,不再频繁的创建、销毁线程。 线程池的作用是提高系统的性能和…

    Java 2023年6月5日
    071
  • 解决.net mvc session超时的问题

    在.NET MVC中session的默认有效期是20分钟 调整的方式是在项目的Web.config中进行配置,如下方式可以调整为120分钟。 <system.web> …

    Java 2023年5月29日
    056
  • jsp中在java里面怎么调文本框里面的值?

    jsp中在java里面怎么调文本框里面的值 方法一: 方法二: Original: https://www.cnblogs.com/muhy/p/14827596.htmlAuth…

    Java 2023年5月29日
    075
  • SpringMVC实战入门教程,四天带你快速搞定springmvc框架

    SpringMVC 也叫Spring web mvc。是Spring 框架的一部分,是在Spring3.0 后发布的。 这里对SpringMVC框架进行一个简单的介绍: sprin…

    Java 2023年6月9日
    069
  • 五分钟搭建博客系统 OK?

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概要: 通过 Docker Compose 在使用 Docker容器构建的隔离环境中轻松运行 WordPress。…

    Java 2023年6月5日
    076
  • springboot使用log4j2代替内置log4j

    前言 log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现 l…

    Java 2023年5月30日
    076
  • Spring Cloud GateWay 简单示例

    前提:提供一个注册中心,可以使用Eureka Server。供gateway转发请求时获取服务实例。 一、新建GateWay项目 1、引入maven依赖 org.springfra…

    Java 2023年5月30日
    065
  • 使用jquery实现文本框输入特效:文字逐个显示逐个消失反复循环

    前两天看到某个网站上的输入框有个小特效:文字逐个显示,并且到字符串最大长度后,逐个消失,然后重新循环显示消失,循环显示字符串数组。我对这个小特效有点好奇,于是今天自己尝试用jque…

    Java 2023年6月6日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球