接受和返回Iterable<T>
类型的Java方法非常普遍。我看到的问题是迭代器interface是如此有限,它要么需要将Iterable重构为可用的数据结构,要么迫使用户执行Iterable的多次遍历,增加执行时间。Java优点和缺点可重用
有人可以纠正我吗? Iterables和我认为的一样糟糕吗?如果你被迫使用它们,是否有任何技术可以用来解决Iterables的局限性?
接受和返回Iterable<T>
类型的Java方法非常普遍。我看到的问题是迭代器interface是如此有限,它要么需要将Iterable重构为可用的数据结构,要么迫使用户执行Iterable的多次遍历,增加执行时间。Java优点和缺点可重用
有人可以纠正我吗? Iterables和我认为的一样糟糕吗?如果你被迫使用它们,是否有任何技术可以用来解决Iterables的局限性?
关于接受和Iterable<T>
这显然是一件好事。这意味着你几乎可以传递任何数据结构 - 它只需要实现非常简单的Iterable<T>
接口。这使代码更容易重用。
对于返回Iterable<T>
的好处之一是该方法的实现可能会发生变化 - 可能使用更高效的数据结构,或者在请求时懒惰地生成结果(例如从磁盘流式传输它们)。在不中断客户的情况下更改实施很容易,因为它们仅取决于接口Iterable<T>
。如果您已经暴露了List<T>
,那么您不能确定您的客户将按顺序访问数据。
如果您需要多次访问结果,那么首先将数据复制到不同的结构中是有意义的。但是只有你知道特定的收藏对你的具体情况最有用。有时候可能是ArrayList
。其他时候,您可能更愿意将商品存储在HashMap
中。所以你通常不得不将数据复制到新的数据结构中。
此外,在JDK 8我们将看到Iterable
接口的重大改进。
由于增加了extension methods,该接口将提供默认的实现和许多新的功能将被添加到提供的能够接受lambda expressions的高次函数的等效,也lazy evaluation将实施由于其迭代性质和不提到并行性,所以现在流行。
接受Iterable<T>
是一个伟大的服务给你的客户。
返回它往往是对他们的损害。如果您不打算改变想法来实现结果,您应该尽可能具体。