不可分裂的分裂器

Kel*_*ung 11 java java-8 spliterator

我试图了解它是如何Spliterator工作的,以及如何设计分裂器.我认识到这trySplit()可能是更重要的方法之一Spliterator,但是当我看到一些第三方Spliterator实现时,有时我会看到他们的分裂器trySplit()无条件地返回null .

问题:

  1. 普通迭代器和Spliterator无条件返回null 之间有区别吗?看起来这样的分裂者似乎击败了分裂.
  2. 当然,有一些合法的分裂器用例有条件地返回null trySplit(),但是有一个无条件返回null的分裂器的合法用例吗?

Adr*_*ard 5

虽然 Spliterator 相对于 Iterator 的主要优点是,正如您所说的,它的 trySplit() 方法允许它并行化,但还有其他显着的优点:

http://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html

Spliterator API 旨在通过支持分解和单元素迭代来支持高效的并行遍历以及顺序遍历。此外,通过 Spliterator 访问元素的协议旨在施加比 Iterator 更小的每个元素开销,并避免为 hasNext() 和 next() 使用单独的方法所涉及的固有竞争。

此外,Spliterators 可以使用StreamSupport.stream直接转换为 Streams以利用 Java8 的流。

  • 我不会称之为*次要*优势。我已经实现了很多`Iterator`,因此,我可以说将遍历逻辑分成两种方法会使它们中的大多数变得复杂。有许多现有的方法具有“获取下一项或‘空’/结束时的特殊值”逻辑。使用这样的后端方法,迭代器的 `hasNext` 方法必须记住下一个 `next` 调用的返回值,并且两个方法都必须跟踪它们是否已经被调用。相比之下,`tryAdvance` 方法实现起来很简单。 (3认同)
  • @Marko Topolnik:“我不使用我不知道的东西”与“一次编写,几乎从未改变”相结合的典型案例。有一个 [关于`String.chars()` 的错误报告](https://bugs.openjdk.java.net/browse/JDK-8071477) 因此,这个实现在 Java 9 中已经改变。有一个相关的[`Files.lines`](https://bugs.openjdk.java.net/browse/JDK-8072773) 的错误报告,带有简洁的注释“这在最初实施时也被注意到,当时的决定是以后再去看看”。因此,您必须为每个地方提交错误报告以强制修改代码。 (2认同)
  • 编辑“次要”->“重要”以反映现实 :) Spliterator 在大多数维度上都是更好的迭代器:不那么活泼,更高效,更能保留信息。缺点是他们需要更多的工作来实施。 (2认同)