Java 8中Spliterator的一个好用例是什么?

21

在Java 8中,Spliterator类有哪些好的使用场景?


Spliterator,不是SplitIterator。 :-) - C. K. Young
我发现这些问题 https://dev59.com/TWAg5IYBdhLWcg3w1t9a?lq=1 和 https://dev59.com/OGIj5IYBdhLWcg3wnmTA 看起来与Spliterator相关。 - EpicPandaForce
1
流是由Spliterators构建的。因此,每次您想从集合创建一个流时,都需要提供一个Spliterator。http://docs.oracle.com/javase/8/docs/api/java/util/stream/StreamSupport.html - JB Nizet
3个回答

6

使用案例示例:"将迭代器转换为流"

public static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
   final Iterable<T> iterable = () -> iterator;
  return StreamSupport.stream(iterable.spliterator(), false);
}

6
通常情况下,应用程序开发人员不会直接使用Spliterator API。但如果您提供API并实现自己的类似集合的类,则可以实现Spliterator以使您的集合适应Stream API。这支持功能方法、并行处理和其他特性。
例如,我编写了一个工具来枚举由CIDR表示法指定的网络中的IP地址。它不是真正的集合;也就是说,它不会一次性在内存中携带所有地址的列表,只有网络号和子网掩码。但通过公开Spliterator,它可以轻松地适应Stream。(每个Spliterator仅跟踪其所在网络部分的当前IP地址和最大地址。)
另一个核心Java运行时的例子是用于遍历文件系统的DirectoryStream

3

SpliteratorIterator类的扩展,允许对对象流进行分割以进行迭代(Stream通过在迭代之前收集操作来工作)。

我想不出一般开发者需要使用Spliterator的情况。Java 8中的CollectionCollections API非常丰富,在大多数情况下,您最好使用普通的Collection子类而不是构建自己的Stream接口。

您可能希望使用Spliterator的一个例子是使用链接数据结构的图形库,其中标准的Spliterator/stream()未定义。


Spliterator并不继承Iterator - erickson
1
@erickson 我不是指继承。它延续了“迭代器”的概念。 - Simon Kuang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接