stream和parallelStream有啥区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stream和parallelStream有啥区别相关的知识,希望对你有一定的参考价值。
参考技术A 1.Stream 是在 Java8 新增的特性,普遍称其为流;它不是数据结构也不存放任何数据,其主要用于集合的逻辑处理。2.Stream流是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值),它只是在原数据集上定义了一组操作。
3.Stream流不保存数据,Stream操作是尽可能惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。
4.Stream流不会改变原有数据,想要拿到改变后的数据,要用对象接收。
串行流stream:串行处理数据,不产生异步线程。
并行流parallelStream:parallelStream提供了流的并行处理,它是Stream的另一重要特性,其底层使用Fork/Join框架实现。简单理解就是多线程异步任务的一种实现。
建议:数据量不大的情况下建议使用stream即可,不要盲目大量使用parallelStream,因为parallelStream是多线程异步的,也就是说会产生多线程,消耗内存不说,说不定还会更慢,并非一定会更快更好。
下面说说常用的几种方法:
groupingBy方法:主要是转化数据为Map,value是符合条件的集合
toMap方法:主要是转化数据为Map,value是该条记录或字段值
filter方法:主要是用来筛选数据的
anyMatch方法:用于判断数据,只要有一个条件满足即返回true
allMatch方法:用于判断数据,必须全部都满足才会返回true
noneMatch方法:用于判断数据,全都不满足才会返回true
map方法:一般用于获取属性值
peek方法:一般用于改变数据,但是官方不建议使用
调用 Stream.Write 和使用 StreamWriter 有啥区别?
【中文标题】调用 Stream.Write 和使用 StreamWriter 有啥区别?【英文标题】:What is the difference between calling Stream.Write and using a StreamWriter?调用 Stream.Write 和使用 StreamWriter 有什么区别? 【发布时间】:2011-02-22 08:30:44 【问题描述】:实例化Stream
对象,如MemoryStream
,调用memoryStream.Write()
方法写入流,和用流实例化StreamWriter
对象,调用streamWriter.Write()
有什么区别?
考虑以下场景:
你有一个方法,它接受一个 Stream,写入一个值,然后返回它。稍后会读取流,因此必须重置位置。有两种可能的方法(似乎都有效)。
// Instantiate a MemoryStream somewhere
// - Passed to the following two methods
MemoryStream memoryStream = new MemoryStream();
// Not using a StreamWriter
private static Stream WriteToStream(Stream stream, string value)
stream.Write(Encoding.Default.GetBytes(value), 0, value.Length);
stream.Flush();
stream.Position = 0;
return stream;
// Using a StreamWriter
private static Stream WriteToStreamWithWriter(Stream stream, string value)
StreamWriter sw = new StreamWriter(stream);
sw.Write(value, 0, value.Length);
sw.Flush();
stream.Position = 0;
return stream;
这部分是范围问题,因为我不想在写入后关闭流,因为稍后会读取它。我当然也不想处理它,因为那会关闭我的流。不同之处似乎在于不使用 StreamWriter 会直接依赖 Encoding.Default,但我不确定这是否很重要。有什么区别,如果有的话?
【问题讨论】:
【参考方案1】:使用 StreamWriter,您可以获得更高级别的重载,可以将各种类型写入流,而无需担心细节。例如你的代码
sw.Write(value, 0, value.Length);
实际上可能只是
sw.Write(value);
使用 StreamWriter.Write(string) 重载。
【讨论】:
【参考方案2】:就byte[]
数组而言,没什么,StreamWriter
确实引入了其他更有用的方法,尽管用于处理其他类型。
【讨论】:
【参考方案3】:StreamWriter 是 Stream 的超类,它实现了 TextWriter 以便于处理文本。但由于它是一个超类,除了文本处理方法之外,它还具有所有相同的方法。这就是为什么在第一个示例中需要 Encoding.Default.GetBytes(value) 而在第二个示例中不需要。
【讨论】:
StreamWriter 来自 TextWriter,而不是 Stream。说 StreamWriter 是 Streams 和 TextWriters 之间的适配器是正确的。【参考方案4】:一个区别是new StreamWriter(stream)
默认使用UTF-8编码,所以它会支持Unicode数据。 Encoding.Default
(至少在我的机器上)是一个固定大小的代码页(例如 Windows-1250),仅支持 ASCII 和一组有限的国家字符(总共 256 个不同的字符)。
你真的不应该做以下事情:
stream.Write(encoding.GetBytes(value), 0, value.Length);
您使用的编码具有 1 字节的固定大小,这只是巧合。 (它不适用于 UTF-16,或 UTF-8 和非 ASCII 数据。)相反,如果您需要直接写入流,请执行以下操作:
byte[] byteData=encoding.GetBytes(value);
stream.Write(byteData, 0, byteData.Length);
【讨论】:
以上是关于stream和parallelStream有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
求求你们了,别再乱用 parallelStream 了,速度竟然比 Stream 还要慢!!
求求你们了,别再乱用 parallelStream 了,速度竟然比 Stream 还要慢!!
为啥 Iterable<T> 不提供 stream() 和 parallelStream() 方法?
Flutter 中的 Sink 和 Stream 有啥区别?