【问题标题】:What is forEach and spliterator in Iterable interface, and how to implement with linked listIterable接口中的forEach和spliterator是什么,以及如何用链表实现
【发布时间】:2014-09-25 04:04:55
【问题描述】:

我的数据结构本质上是一个链表,这意味着它的节点包含指向下一个节点的数据。

我已经研究过在这个类上使用 for 循环来促进迭代,我发现必须实现 Iterable 接口。但是,我对如何实现 forEach() 和 spliterator() 以及每个方法的作用感到困惑。

【问题讨论】:

  • Spliterator 文档非常深入,您遇到了哪些具体问题?
  • 显然,简单的“for”循环没有必要,但我仍然想知道它的作用。如果您能提供一个比 API 文档更简短、更清晰的简要概述,那就太好了。
  • 你知道Java 8 streams吗?

标签: java list for-loop linked-list iterator


【解决方案1】:

这是你可以如何实现拆分器:

@Override
public Spliterator<A> spliterator() {
    return Spliterators.spliterator(iterator(), size(), Spliterator.ORDERED);
}

【讨论】:

    【解决方案2】:

    您不必实现spliterator()forEach() 方法。这些方法是在 Java 8 中引入的,它们有一个默认实现。

    关于他们的工作:

    spliterator() 在此Iterable 描述的元素上创建一个SpliteratorSpliterator 用于遍历和划分源的元素(例如,可以是集合)。它在 Java 8 中用于创建并行的 Streams 对象,这将允许您对 Iterable 的项目并行执行操作。

    forEach(Consumer action)Iterable 的所有元素执行一个操作(通过调用传递给它的Consumeraccept 方法)。

    它的默认实现是这样的:

     for (T t : this)
         action.accept(t);
    

    您只需实现iterator() 方法,该方法返回一个Iterator

    当然,您可以在JavaDoc of Iterable 中阅读所有这些内容。

    【讨论】:

    • 所以我所要做的就是拥有一个返回迭代器的方法?
    • 虽然the docs 确实说(spliterator“通常应该覆盖默认实现。” 而这个答案并没有说明 “每种方法的作用。” (即使有编辑,这只是引出了问题。)
    • 链表可能无法获得比默认更好的spliterator() 实现,所以你应该这样做。
    • @T.J.Crowder 我想说,只有当您打算使用 Iterable 创建并行流时,您才应该考虑覆盖它。
    • 我仍然认为这并不能说明任何事情。
    猜你喜欢
    • 2010-10-10
    • 2011-08-28
    • 2010-11-06
    • 1970-01-01
    • 2020-11-05
    • 2014-01-23
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多