什么时候应该接受Java中Iterable <T>与Collection <T>的参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

在Java 中使用Iterable<T>vs有什么考虑Collection<T>

例如,考虑实现一个主要涉及包含Foos 集合和一些关联元数据的类型。这种类型的构造函数允许一次初始化对象列表。(可以稍后设置元数据。)此构造函数应接受哪种类型?Iterable<Foo>,还是Collection<Foo>

这个决定有什么考虑?

遵循库类型(如ArrayList可以从任何初始化Collection,但不是Iterable)初始化的模式将导致我使用Collection<Foo>

但为什么不接受Iterable<Foo>,因为这对于初始化需求已经足够了?为什么要求Collection消费者提供更高级别的功能(),而不是严格必要的(Iterable)?

提问于
用户回答回答于

许多集合类型之前都存在Iterable<T>(仅在1.5版本中引入) - 几乎没有理由添加构造函数来接受Iterable<T> 以及 Collection<T>改变现有的构造函数将会是一个突破性改变。

我个人会使用,Iterable<T>如果这允许你做你想要的一切。它对呼叫者更加灵活,特别是它可以让你使用Google Java Collections(毫无疑问,类似的库)进行相对简单的过滤/投影等。

用户回答回答于

Iterable产生Iterator对象。一个Iterator对象,根据定义,迭代。注意,Iterator接口没有承诺next()hasNext()返回之前可以调用多少次false。一种Iterator可能可能遍历Integer.MAX_VALUE + 1其前值hasNext()方法返回false

但是,a Collection是一种特殊的形式Iterable。因为一个元素Collection不能多于Integer.MAX_VALUE(根据该size()方法),所以很自然地推测它的Iterator对象不会迭代这些元素。

因此,通过接受一个Collection而不是一个Iterable,你的课堂可以保证有多少元素被传入。如果你的课堂本身就是a,那么这是特别理想的Collection

扫码关注云+社区