【问题标题】:Best type of iterator to return for a collection? Spliterator, Stream? [duplicate]返回集合的最佳迭代器类型?分离器,流? [复制]
【发布时间】:2020-04-21 14:41:52
【问题描述】:

我有一个服务层,其中有许多方法返回(通常是很多)对象的集合。这些集合仅用于迭代(最终并行)。

最好/常用的返回类型是什么?

  • Spliterator<T>
  • Stream<T>

【问题讨论】:

  • 实现Iterable<T>。如果需要,覆盖.spitterator()
  • 都不返回,根据this Answer
  • 嗯,你提到的答案并不清楚:改用什么?在我的上下文中,返回 Collection<T> 是毫无疑问的。而且我需要允许用户对元素进行并行处理。

标签: java java-8 java-stream


【解决方案1】:

如果调用部分只是要遍历它(map、filter...),您应该更喜欢 Stream,因为 Stream 已经具有这些内置函数,并且不需要具体化特定的集合...。让调用者根据需要实现流。

【讨论】:

    【解决方案2】:

    他们都不是。返回位于集合层次结构顶部且符合迭代条件的Iterable<T>

    实现此接口允许对象成为“for-each 循环”语句的目标。请参阅 For-each 循环

    上述类的用途有点不同:

    • Spliterator<T> 是一个用于遍历和划分源元素的对象,但它并不代表源(集合)本身。每个Iterable 都有一个返回Spliterator 的方法。
    • Stream<T> 是一个元素序列。其目的是处理元素,直到调用终端操作。这不如来源有用。要从 Spliterator 创建并行流,请使用

      StreamSupport.stream(iterable.spliterator(), false)
      

    关键是列表中上面提到的所有内容都可以从应该用作源的Iterable<T> 创建。

    【讨论】:

    • 你的意思是返回Iterator<T> 我猜?好吧,在这种情况下,这是一个很大的性能打击。例如,使用Streams::stream(Iterator<T>) 转换回流将丢失大小信息。所以count()reduce 方法需要遍历所有的序列。其他并行迭代也是如此。
    • 我不是指Iterator,而是Iterable。您说:“这些集合仅用于迭代(最终并行)。最好/通常使用的返回类型是什么?” - 我回答了一般性问题。我认为没有理由返回 StreamSpliterator 或任何其他 *erator
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2021-08-31
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多