这是一个例子:代码A:
files.forEach(f -> {
//TODO
});
另一个代码B可以这样使用:
files.stream().forEach(f -> { });
两者有什么区别,有stream()
和没有stream()
?
流是一个元素序列(即数据结构),用于耗尽一个操作或迭代。任何集合都可以作为流公开。您在流上执行的操作可以是
中间操作(map,skip,concat,substream,distinct,filter,sorted,limit,peek..)产生另一个java.util.stream.Stream,但中间操作是惰性操作,只有在执行终端操作后才会执行。
和终端操作(for每,最大,计数,匹配任何,findFirst,减少,收集,总和,find任何)产生一个对象,这不是一个流。
基本上,它类似于Unix中的管道。
语义学方面没有区别,尽管没有stream
的直接实现可能效率稍高。
实际上,它们基本上是相同的,但有一点语义上的差异。
代码A由Iterable.for每个
定义,而代码B由Stream.for每个
定义。Stream.for每个
的定义允许以任何顺序处理元素——即使是顺序流。(对于并行流,Stream.for每个
很可能会乱序处理元素。)
Iterable.for每个
都从源代码中获取一个迭代器,并在其上调用forEachRem”()
。据我所知,的所有当前(JDK 8)实现Stream.for集合类上的每个
都将创建一个从源代码的迭代器之一构建的拆分器,然后将在该迭代器上调用forEachRem”,就像
Iterable.for每个
一样。所以他们做同样的事情,尽管流版本有一些额外的设置开销。
然而,在未来,streams实现可能会发生变化,因此不再是这种情况。
(如果您想保证处理流元素的顺序,请改用
forEachOr的()
。)
我理解,使用,我可以使用类似的链操作,或者使用并行流。但是如果我需要执行小操作(例如,打印列表的元素),它们之间有什么区别呢?
问题内容: 我知道有很多这样的话题。而且我知道基础知识:既可以在原始阵列上运行,也可以在新阵列上运行。 就我而言: 这是输出: 我不明白为什么要使用更改to的值。 如果这是一个愚蠢的问题,我感到很抱歉,但是我是这种语言的新手,到目前为止我发现的答案并不令我满意。 问题答案: 他们是不一样的。让我解释一下区别。 :这会遍历列表,并对每个列表成员应用一些有副作用的操作(例如:将每个列表项保存到数据库)
我正在学习Python中的Spark,想知道有没有人能解释一下动作foreach()和转换map()之间的区别? <代码>rdd。map()返回一个新的RDD,就像Python中的原始map函数一样。然而,我想看到一个rdd。foreach()函数并理解其差异。谢谢
问题内容: 我了解使用,我可以使用类似链操作或使用并行流。但是,如果我需要执行小的操作(例如,打印列表的元素),它们之间有什么区别? 问题答案: 对于诸如所示的简单情况,它们基本上是相同的。但是,有许多细微的差异可能很重要。 一个问题是订购。使用,顺序不确定。顺序流不太可能发生,但仍可以按任意顺序执行。这确实在并行流中经常发生。相反,如果指定,则总是以的迭代顺序执行。 另一个问题是副作用。必须指定
问题内容: 各自的优缺点是什么?请建议何时使用一种而不是另一种。 问题答案: 数据存储 发布/订阅是发布者/订阅者平台,不是数据存储。无论是否有订阅者,发布的消息都会消失。 在Redis Streams中,stream是一种数据类型,它本身就是一种数据结构。消息或条目存储在内存中,并保留在那里直到被命令删除。 同步/异步通信 发布/订阅是同步通信。各方需要同时处于活动状态才能进行通信。Redis在
matplotlib之间的区别是什么。pyplot和matplotlib。派拉布? 哪一个是首选的什么用途? 我有点困惑,因为它似乎是独立的,我可以做同样的事情。我错过了什么?