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 有啥区别?

调用 Stream.Write 和使用 StreamWriter 有啥区别?

browserSync.reload 和 browserSync.stream()) - 有啥区别?