- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我读了一些关于如何创建有限的 Stream
的问题( Finite generated Stream in Java - how to create one? , How do streams stop? ).
建议实现 Spliterator
的答案。 Spliterator
将实现如何提供以及下一个提供哪个元素的逻辑 (tryAdvance
)。但是还有另外两个非默认方法 trySplit
和 estimateSize()
我必须实现。
Spliterator
的 JavaDoc 说:
An object for traversing and partitioning elements of a source. The source of elements covered by a
Spliterator
could be, for example, an array, aCollection
, an IO channel, or a generator function. ... TheSpliterator
API was designed to support efficient parallel traversal in addition to sequential traversal, by supporting decomposition as well as single-element iteration. ...
另一方面,我可以实现如何围绕 Stream.Builder
前进到下一个元素并绕过 Spliterator
的逻辑。在每次前进时,我都会调用 accept
或 add
并在最后调用 build
。所以它看起来很简单。
JavaDoc 说了什么?
A mutable builder for a
Stream
. This allows the creation of aStream
by generating elements individually and adding them to theBuilder
(without the copying overhead that comes from using anArrayList
as a temporary buffer.)
使用 StreamSupport.stream
我可以使用 Spliterator
来获取 Stream
。并且 Builder
将提供一个 Stream
。
我什么时候应该/可以使用 Stream.Builder
?
仅当 Spliterator
不会更高效时(例如,因为源无法分区且无法估计其大小)?
最佳答案
请注意,您可以扩展 Spliterators.AbstractSpliterator
.那么,就只有tryAdvance
来实现了。
所以实现一个Spliterator
的复杂度并不高。
根本区别在于 Spliterator
的 tryAdvance
方法仅在需要新元素时调用。相比之下,Stream.Builder
有一个存储,在您获取 Stream 之前,它将填充所有流元素。
因此,Spliterator
是各种惰性求值的首选,也是当您要遍历现有存储以避免复制数据时的首选。
构建器是元素创建不统一时的首选,无法表达按需创建元素。想一想您本来可以使用 Stream.of(...)
的情况,但事实证明它太不灵活了。
例如你有 Stream.of(a, b, c, d, e)
,但现在事实证明,c
和 d
是可选的。所以解决方法是
Stream.Builder<MyType> builder = Stream.builder();
builder.add(a).add(b);
if(someCondition) builder.add(c).add(d);
builder.add(e).build()
/* stream operations */
其他用例是 this answer ,其中需要 Consumer
来查询现有的拆分器并将值推回到 Stream
之后,或者 this answer ,其中没有随机访问的结构(类层次结构)应该以相反的顺序流式传输。
关于java - Spliterator 与 Stream.Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52336068/
我在想问题的答案:How to test for null keys on any Java map implementation? 我的第一个想法是检查 map 键集的 Spliterator 是否
在 Java 1.8.0_25 发布到荒野之后有一个有趣的情况......我相信我的问题的根源主要与接口(interface)中“默认”实现的新(到 1.8)特性有关。 我正在开发的应用程序目前的目标
我发现 Java 并行流有一些令人惊讶的行为。我自己制作了Spliterator ,并且生成的并行流被分割,直到每个流中只有一个元素。这似乎太小了,我想知道我做错了什么。我希望我可以设置一些特征来纠正
我对我的所有研究感到有点困惑。我有一个名为 TabularResultSet 的自定义界面(为了举例,我已经淡化了它)它遍历任何本质上是表格的数据集。它有一个类似于迭代器的 next() 方法,它可以
我遇到了流的 dropWhile 或 takeWhile 方法的问题,因为 spliterator 正在跳过特定模式奇数或偶数中的文本部分。应该怎样处理文本的所有部分?我的方法在这里: void re
https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html SIZED Characteristic value sign
我正在玩 Java 8 Spliterator并创建了一个将斐波那契数字流式传输到给定的 n。所以对于斐波那契数列 0, 1, 1, 2, 3, 5, 8, ... n fib(n) -----
我想使用 Stream 并行处理一组未知数量的异构远程存储 JSON 文件(文件数量预先未知)。这些文件的大小差异很大,从每个文件 1 个 JSON 记录到某些其他文件中的 100,000 条记录。在
这可能是非常基本的,但我不是 Java 人。这是我的处理代码,它只是打印和 hibernate : private static void myProcessings(int value)
我正在查看 Spliterator 的文档,根据它,Spliterator 不是线程安全的: Despite their obvious utility in parallel algorithms,
我最近发现了一个错误 StreamSupport.intStream(/* a Spliterator.ofInt */, true) .limit(20) 调用 Spliterator.of
我在 java.util.Spliterator (Java 8) 中偶然发现了一个有趣的细节。 方法 trySplit() 应该返回 Spliterator 的实例或 null,如果它不能被拆分。
我明白 there is overhead in setting up并行 Stream 的处理,如果项目很少或每个项目的处理速度很快,则单线程中的处理速度更快。 但是,trySplit() 是否有类
stream.spliterator() 是否隐式关闭了 stream,还是之后需要显式关闭它? Stream stream = Stream.of("a", "b", "c"); Spliterat
在Collection的源代码中,我想知道为什么@Override使用注释。 spliterator()方法不是来自 Iterable ,和Object也没有。 public interface Co
我正在使用 Java 8 流。 当我使用 spliterator 添加到 map 时,出现重复键异常,但使用标准 for 循环不会引发异常。 // This works Map myMap = new
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我读了一些关于如何创建有限的 Stream 的问题( Finite generated Stream in Java - how to create one? , How do streams sto
我将流拆分器直接用于我正在编写的库中的低级操作。最近,当我进行流拆分器和交错 tryAdvance/trySplit 调用时,我发现了非常奇怪的行为。这是演示问题的简单代码: import java.
我注意到使用 Guava 的 Iterables.partition(collection, partitionSize).spliterator() 生成的拆分器表现得很奇怪。 在生成的拆分器上执行
我是一名优秀的程序员,十分优秀!