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()));
java函数式编程 map_函数式编程-对Java 8流进行分区相关推荐
- Java 自动排序map_跟我学Java编程—应用自动排序的TreeMap
前面介绍了Map接口的实现类LinkedHashMap,LinkedHashMap存储的元素是有序的,可以保持元素的插入顺序,但不能对元素进行自动排序.在一些编程应用场景中,如果在数据的存储过程中,能 ...
- java 先进先出的map_「 深入浅出 」java集合Collection和Map
本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...
- java 函数式编程_函数式编程杂谈
比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算.本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处. 一 ...
- java函数式编程_Java 函数式编程和 lambda 表达式详解
作者:DemonsI my.oschina.net/demons99/blog/2223079 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要 ...
- java 函数式编程_Java函数式编程:Javaslang入门
java 函数式编程 Java是一门古老的语言,并且该领域中有很多新手在他们自己的领域(JVM)上挑战Java. 但是Java 8到来并带来了一些有趣的功能. 这些有趣的功能使编写新的惊人框架(例如S ...
- java8 函数式编程_您必须学习Java 8的函数式编程吗?
java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...
- 面向java开发者的函数式编程_函数式编程让你忘记设计模式
本文是一篇<Java 8实战>的阅读笔记,阅读大约需要5分钟. 有点标题党,但是这确实是我最近使用Lambda表达式的感受.设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让 ...
- java和python中函数式编程
本篇文章将基于java和python分别介绍Lambda表达式,包括定义,使用等 java函数式编程 自jdk1.8开始,java中引入了函数式编程,使编程更加简洁灵活.接下来通过详细的例子阐述 函数 ...
- Java三行情书_函数式编程思维在三行代码情书中的应用
函数式编程概述 如今主流的编程语言,函数式编程范式或多或少都融入其中成了"标配",或者说主流语言都在进行函数式方面的扩充,这是一个大趋势.以Java为例,随着 Lambda块 和 ...
最新文章
- Spinnaker部署
- mysql处理高并发,防止库存超卖
- ios 发送请求时按home_iOS 10按下Home键能即响应返回桌面了
- 淘系的音视频编辑方案:非线性编辑引擎
- java之Synchronized(锁住对象和锁住代码)
- Mac安装mysql数据库【亲测有用】
- mac+免密登陆+linux,mac ssh免密登录Linux
- java面向对象的特征封装_Java总结-Java面向对象的基本特征之一:封装性
- 使用idea创建项目并通过git上传到码云
- java web 前端学习路线
- linux开发屏幕保护代码,使用xscreensaver编写屏幕保护程序的提示和技巧?
- android 混淆 minifyEnabled
- 设计一套前端项目组织结构
- 给文件夹加密的两种方法
- 使用Telerik控件搭建Doubanfm频道部分
- qt在表格中如何画线_如何在电子表格中的某单元格内画一根长线
- 软件测试——基础理论知识你都不一定看得懂
- Dubbo(Spring配置)
- 深度学习和神经网络的介绍
- 担心基站高辐射?快来看5G建设电磁辐射科普宣传片