代码之家  ›  专栏  ›  技术社区  ›  Daniel Fortunov

在Java中,我应该何时接受一个迭代的<t> vs.集合< t>的参数?

  •  66
  • Daniel Fortunov  · 技术社区  · 15 年前

    使用的注意事项是什么 Iterable<T> VS Collection<T> 在Java中?

    例如,考虑实现一个主要与包含 Foo 以及一些相关的元数据。此类型的构造函数允许一次性初始化对象列表。(元数据可以稍后设置。)此构造函数应接受什么类型? Iterable<Foo> Collection<Foo> ?

    这个决定的考虑因素是什么?

    遵循库类型(如 ArrayList (可从任何 Collection 但是 Iterable )会引导我使用 收藏<foo> .

    但是为什么不接受呢 iTable<foo> ,考虑到这足以满足初始化需求?为什么需要更高级别的功能( 收藏 )从消费者那里,比严格必要的( 可迭代的 )?

    9 回复  |  直到 7 年前
        1
  •  62
  •   Neuron MonoThreaded    7 年前

    以前有许多集合类型 Iterable<T> (仅在1.5中引入)-几乎没有理由添加一个构造函数来接受 I表<T> 以及 Collection<T> 但是更改现有的构造函数将是一个破坏性的更改。

    我个人会用 I表<T> 如果这允许你做你想做的一切。它对打电话的人来说更为灵活,尤其是让你这样做 相当地 容易过滤/投影/使用谷歌Java集合(无疑是相似的库)。

        2
  •  18
  •   Adam Paynter    15 年前

    Iterable 生产 Iterator 物体。安 迭代器 对象,根据定义, 迭代 . 请注意, 迭代器 接口不承诺多少次 next() 可以在之前调用 hasNext() 收益率 false . 安 迭代器 可能重复 Integer.MAX_VALUE + 1 其前面的值 HasNeXT() 方法返回 .

    然而,A Collection 是一种特殊的形式 可迭代的 . 因为A 收藏 不能超过 Integer.MAX_VALUE 元素(凭借 size() 方法),自然认为 迭代器 对象不会在这许多元素上迭代。

    因此,通过接受 收藏 而不是 可迭代的 ,您的类可以对传入的元素数量有一些保证。如果你的班级本身是一个 收藏 .

    只是我的两分钱…

        3
  •  8
  •   Michael Myers KitsuneYMG    15 年前

    使用最通用的界面。既然你要做的就是迭代,那么我会说 Iterable 是前进的道路(因为它允许懒惰的迭代器等)。您不关心迭代器来自何处,所以不要对它进行过多的限制。

        4
  •  8
  •   8bitjunkie Vikram    12 年前

    用户 Spring Data JPA 会发现 Repositories 返回类型的集合 Iterable<T>.

    在我过去从事过的项目中, Spring ,我发现在检索后对集合进行操作的需要经常指示 Iterable<T> 在业务层中使用,而不是 Collection<T> 为了选择一个对象 T 从集合中。

    所有收藏都是 Iterable (这是扩展 Collection 接口,所以不是 Map !)所以使用 可迭代的 在业务层中,仅仅是通过超类型引用集合的一种情况,并且仍然允许使用 for-each 迭代。

    如果需要操作集合的内容,方便方法将允许您填充新的 收藏 ,这样你就可以利用 contains() , remove() 等与原始采集数据。

    另外,为实现这一目的,流行的第三方API(如GoogleGuava和ApacheCommons)也提供了方便的方法。

        5
  •  4
  •   starblue    15 年前

    一些构造函数,例如arraylist(collection c),为了提高效率,使用collection的toarray()方法。

        6
  •  3
  •   Rick    15 年前

    请参见“为什么如此强调迭代器和iterables?”上 Google Collection FAQ 对于优先使用迭代器的合适参数,尤其是在处理大量数据时。一个可能会有帮助的类比是,考虑到只向前的只读游标和可滚动的游标之间的区别。

        7
  •  2
  •   Patrick McDonald    15 年前

    如果您选择集合,那么您的类只能从集合初始化;如果您选择iterable,那么您可以从集合或iterable初始化。

    由于两者的工作和性能将是相同的,所以在构造函数中接受ITerable是完全有意义的。

        8
  •  0
  •   Paul McKenzie    15 年前

    根据最小惊奇原则,您应该模仿Java集合模式并使用集合构造函数ARG。这会使追捕你的人稍微不那么困惑。

        9
  •  -1
  •   Steve B.    15 年前

    你是对的,因为要求你所需要的最一般的形式被认为是很好的做法。