栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 8 如何以并发方式在同一个流 上执行多种操作

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 8 如何以并发方式在同一个流 上执行多种操作

Java 8 中,流有一个非常大的(也可能是最大的)局限性,使用时,对它操作一次仅能得到一个处理结果。实际操作中,如果你试图多次遍历同一个流,结果只有一个,那就是遭遇下面这样的异常:
java.lang.IllegalStateException: stream has already been operated upon or closed
虽然流的设计就是如此,但我们在处理流时经常希望能同时获取多个结果。
本篇利用一个通用API,即Spliterator,尤其是它的延迟绑定能力,结合BlockingQueues和Futures来实现这一大有裨益的特性。

1.复制流

    要达到在一个流上并发地执行多个操作的效果,你需要做的第一件事就是创建一个StreamForker,这个StreamForker会对原始的流进行封装,在此基础之上你可以继续定义你希望执行的各种操作。我们看看下面这段代码。

public class StreamForker {

	private final Stream stream;
	private final Map, ?>> forks = new HashMap<>();

	public StreamForker(Stream stream) {
		this.stream = stream;
	}

	
	public StreamForker fork(Object key, Function, ?> f) {
		forks.put(key, f);
		return this; //返回this从而保证多次流畅地调用fork方法
	}

	public Results getResults() {
	
	ForkingStreamConsumer consumer = build();

		try {
			stream.sequential().forEach(consumer);
		} finally {
			consumer.finish();
		}

		return consumer;
	}

}

    所有由fork方法添加的操作的执行都是通过getResults方法的调用触发的,该方法返回一个Results接口的实现,具体的定义如下:

	public interface Results {

	  R get(Object key);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571619.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号