接受和返回Iterable<T>
类型的Java方法非常常见。我看到的问题是Iterator interface非常有限,要么需要将Iterable重构为可用的数据结构,要么强制用户执行Iterable的多次遍历,从而增加执行时间。
有人可以纠正我吗? Iterables是否像我认为的那样糟糕?如果您被迫使用它们,是否有任何技术可以用来解决Iterables的限制?
答案 0 :(得分:6)
关于接受 Iterable<T>
这显然是一件好事。这意味着您几乎可以传递任何数据结构 - 它只需要实现非常简单的Iterable<T>
接口。这使代码更容易重用。
对于返回Iterable<T>
的一个优点是该方法的实现可以改变 - 可能使用更有效的数据结构,或者在请求时懒惰地生成结果(例如,从磁盘流式传输它们) 。在不破坏客户端的情况下更改实现很容易,因为它们仅依赖于Iterable<T>
接口。如果您公开了List<T>
,那么您无法确定您的客户将按顺序访问数据。
你是对的,如果你需要多次访问结果,那么首先将数据复制到不同的结构是有意义的。但只有您知道哪些特定集合对您的特定情况最有用。有时它可能是ArrayList
。其他时候您可能希望将项目存储在HashMap
中。因此,您通常不得不将数据复制到新的数据结构中。
答案 1 :(得分:1)
此外,在JDK 8中,我们会看到Iterable
界面的重大改进。
通过添加extension methods,接口将提供默认实现,并且将添加许多新函数以提供相当于能够接受lambda expressions的高阶函数,lazy evaluation由于它们的迭代性质而不是并行性,所以将在时尚界实现。
答案 2 :(得分:1)
接受Iterable< T >
对您的客户来说是一项很棒的服务。
返回它往往是对他们的伤害。如果您不打算改变您对用于实现结果的集合的想法,那么您应该尽可能具体。