java函数式编程 map_函数式编程-对Java 8流进行分区

将任意源流划分为固定大小的批次是不可能的,因为这会加重并行处理。 并行处理时,您可能不知道拆分后第一个子任务中有多少个元素,因此您无法为下一个子任务创建分区,直到完全处理第一个子任务。

但是,可以从随机访问ofSubLists创建分区流。例如,在我的ofSubLists库中可以使用这种功能:

List input = Arrays.asList(...);

Stream> stream = StreamEx.ofSubLists(input, partitionSize);

或者,如果您真的想要流:

Stream> stream = StreamEx.ofSubLists(input, partitionSize).map(List::stream);

如果您不想依赖第三方库,则可以手动实现此类ofSubLists方法:

public static Stream> ofSubLists(List source, int length) {

if (length <= 0)

throw new IllegalArgumentException("length = " + length);

int size = source.size();

if (size <= 0)

return Stream.empty();

int fullChunks = (size - 1) / length;

return IntStream.range(0, fullChunks + 1).mapToObj(

n -> source.subList(n * length, n == fullChunks ? size : (n + 1) * length));

}

该实现看起来有些长,但是考虑了一些极端情况,例如接近MAX_VALUE列表大小。

如果您想为无序流提供并行友好的解决方案(因此您不必担心将哪些流元素合并为单个批处理),则可以使用这样的收集器(感谢@sibnick的启发):

public static Collector unorderedBatches(int batchSize,

Collector, A, R> downstream) {

class Acc {

List cur = new ArrayList<>();

A acc = downstream.supplier().get();

}

BiConsumer accumulator = (acc, t) -> {

acc.cur.add(t);

if(acc.cur.size() == batchSize) {

downstream.accumulator().accept(acc.acc, acc.cur);

acc.cur = new ArrayList<>();

}

};

return Collector.of(Acc::new, accumulator,

(acc1, acc2) -> {

acc1.acc = downstream.combiner().apply(acc1.acc, acc2.acc);

for(T t : acc2.cur) accumulator.accept(acc1, t);

return acc1;

}, acc -> {

if(!acc.cur.isEmpty())

downstream.accumulator().accept(acc.acc, acc.cur);

return downstream.finisher().apply(acc.acc);

}, Collector.Characteristics.UNORDERED);

}

用法示例:

List> list = IntStream.range(0,20)

.boxed().parallel()

.collect(unorderedBatches(3, Collectors.toList()));

结果:

[[2, 3, 4], [7, 8, 9], [0, 1, 5], [12, 13, 14], [17, 18, 19], [10, 11, 15], [6, 16]]

这样的收集器是完全线程安全的,并为顺序流生成有序批。

如果要对每个批次应用中间转换,则可以使用以下版本:

public static Collector unorderedBatches(int batchSize,

Collector batchCollector,

Collector downstream) {

return unorderedBatches(batchSize,

Collectors.mapping(list -> list.stream().collect(batchCollector), downstream));

}

例如,通过这种方式,您可以即时对每个批次中的数字求和:

List list = IntStream.range(0,20)

.boxed().parallel()

.collect(unorderedBatches(3, Collectors.summingInt(Integer::intValue),

Collectors.toList()));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网+2.0:技术有多强 梦想才有多近

在过去不到十年的时间里&#xff0c;互联网行业高速发展。先是以手机、pad等智能终端为主的移动互联网打破了PC端互联网商业发展瓶颈&#xff0c;实体经济也依托互联网进行改造升级&#xff0c;“互联网”成为行业图腾和符号。后是随着人工智能、大数据、云计算等技术的融入&am…

java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园

定时器的应用1、 定时器主要涉及到两个类(java.util包中)-》public class Timer extendsObject(一种工具&#xff0c;线程用其安排以后在后台线程中执行的任务。可安排任务执行一次&#xff0c;或者定期重复执行。 )-->public abstract class TimerTask extendsObjectimple…

java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型

在java中允许指定函数返回的类型,例如下面的代码public class Test {static class Dad {Dad me() {return this;}}static class Son extends Dad {Son me() {return this;}}}已验证.我们来看看ArrayList类.它已经覆盖了clone()函数(至少我看到它在Oracle jdk 1.7源代码)public …

效率提升,英特尔助力企业驶入“快车道”

随着越来越多的企业加入数字化转型大军&#xff0c;每个企业都在期待着数字化带来的业务创新及优化。从云平台的应用、大数据的决策分析&#xff0c;再到工作流程自动化&#xff0c;企业的IT部门不再仅仅是维护企业本身的业务运作以及数据处理&#xff0c;而是需要接入整个生态…

java怎么写事件listener_java 事件监听器ActionListener

/** 功能:java事件监听器ActionListener*/package com.events;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class changebgcolor extends JFrame implements Ac…

Spring AOP 使用介绍,从前世到今生

前面写过 Spring IOC 的源码分析&#xff0c;很多读者希望可以出一个 Spring AOP 的源码分析&#xff0c;不过 Spring AOP 的源码还是比较多的&#xff0c;写出来不免篇幅会大些。本文不介绍源码分析&#xff0c;而是介绍 Spring AOP 中的一些概念&#xff0c;以及它的各种配置…

求1到500以内所有的完数并输出。

如果一个数恰好等于除它本身外的所有因子之和&#xff0c;则这个数就称为完数。 例如&#xff1a;6的因子是1、2、3、&#xff0c;且6123&#xff0c;所以6是完数。 #include <stdio.h> void main() {int s,i,j;for(i1;i<500;i){printf("%d ",i);} } 在这…

java怎么用doss窗口_GitHub - doss128/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...

下一代的社区系统&#xff0c;为未来而构建&#x1f4a1; 简介Symphony([ˈsɪmfəni]&#xff0c;n.交响乐)是一个现代化的社区平台&#xff0c;因为它&#xff1a;实现了面向内容讨论的论坛实现了面向知识问答的社区包含了面向用户分享、交友、游戏的社交网络100% 开源⚡ 动机…

机器学习算法比较

本文主要回顾下几个常用算法的适应场景及其优缺点&#xff01;&#xff08;提示&#xff1a;部分内容摘自网络&#xff09;。机器学习算法太多了&#xff0c;分类、回归、聚类、推荐、图像识别领域等等&#xff0c;要想找到一个合适算法真的不容易&#xff0c;所以在实际应用中…

还在用 Python 2.x?Python 3.7.0 正式发布!

6 月 27 日&#xff0c;期待已久的 Python 3.7.0 正式发布&#xff0c;与之同行的还有 3.6.6 版本的更新。此次&#xff0c;最新版的 Python 3.7.0 带来了诸多的新功能和优化&#xff0c;接下来&#xff0c;让我们一睹为快。Python 3.7.0 主要更新新的语法特性&#xff1a;PEP …

java entry的用法_Map.Entry用法

Java Entry用法./*** 遍历Map的方式* author MONEY*/public class test {public static void main(String[] arg0){Map mapnew HashMap();map.put("1", "da");map.put("2", "jia");map.put("3", "hao");//第一种使…

docker停止信号java_docker容器优雅停止

由于应用镜像是由spring boot制作的&#xff0c;在关注docker 容器停止之前&#xff0c;先看下Java应用是如何处理程序停止的。java shutdownhook在java程序停止前&#xff0c;我们可能会需要一些清理工作&#xff0c;如关闭数据库连接池&#xff0c;执行一些反注册等。Runtime…

2018 年你需要知道的 11 个 JavaScript 库

译者按&#xff1a;你可能已经用到Underscore或者Lodash。本文列举了11个常用的库来提高开发效率。为了保证可读性&#xff0c;本文采用意译而非直译。另外&#xff0c;本文版权归原作者所有&#xff0c;翻译仅用于学习。JavaScript依然是2018年最受欢迎、最流行的编程语言&…

云化要求下,数据库架构的演进

如今&#xff0c;大型企业如金融企业和银行等&#xff0c;在下一代的微服务架构转型要求下&#xff0c;需要基础软件和数据平台能够实现原生的云化&#xff0c;以满足微服务架构的需求。微服务&#xff0c;也就是一种面向服务的&#xff0c;有特定边界的松散耦合的架构。主要特…

java定义变量的输入_Terraform中输入变量

Terraform中输入变量把所有的信息&#xff0c;如access_key等全部硬编码显然是不安全的。因此需要能够参数化配置。变量定义首先需要先定义(声明)变量&#xff0c;放到一个.tf文件中&#xff0c;如&#xff1a;variable "access_key" {}variable "secret_key&qu…

消息中间件—简谈Kafka中的NIO网络通信模型

前面写的两篇RocketMQ源码研究笔记系列&#xff1a;1. 消息中间件—RocketMQ的RPC通信&#xff08;一&#xff09;2. 消息中间件—RocketMQ的RPC通信&#xff08;二&#xff09;基本上已经较为详细地将RocketMQ这款分布式消息队列的RPC通信部分的协议格式、消息编解码、通信方式…

java整属取余数_js取整数、取余数的方法

摘要&#xff1a;这篇JavaScript栏目下的“js取整数、取余数的方法”&#xff0c;介绍的技术点是“取余数、取整数、取余、取整、js、方法”&#xff0c;希望对大家开发技术学习和问题解决有帮助。1.丢弃小数部分,保留整数部分parseInt(5/2)2.向上取整,有小数就整数部分加1Math…

如何系统学习领域驱动设计?

一、领域驱动设计为何又焕发青春&#xff1f;领域驱动设计&#xff08;Domain Driven Design&#xff0c;DDD&#xff09;确实已不再青春&#xff0c;从 Eric Evans 出版了划时代的著作《领域驱动设计》至今&#xff0c;已有将近十五年的时间&#xff0c;在软件设计领域中&…

java当中有关循环的代码_有关Java循环的内容,编程中还是比较常用的,下面分享给大家几个循环的示例代码,练习一下。1、循环输出1到100之间所有能被3或能被4整除的数。pack...

有关Java循环的内容&#xff0c;编程中还是比较常用的&#xff0c;下面分享给大家几个循环的示例代码&#xff0c;练习一下。1、循环输出1到100之间所有能被3或能被4整除的数。package com.hz.loop02;/*** 1、循环输出1到100之间所有能被3或能被4整除的数。* author ztw**/publ…

java的编辑框丢失焦点_java – 捕获EditText丢失焦点

我是一名长期,自学成才的业余VB程序员,现在正在尝试自学Java和Android.我这样说,所以你会知道我不会说好语言,而且对这两种追求都是非常新的.我开发了一个Android表单,其中包含一系列EditText框,每个框的内容都要在用户填写后保存到数组中.如果用户按下Enter键,我已经想出了如何…