将可迭代对象转换为集合的简便方法

491
在我的应用程序中,我使用第三方库(具体来说是Spring Data for MongoDB)。
该库的方法返回Iterable<T>,而我的其他代码期望Collection<T>
是否有任何实用方法可以让我快速地将一个转换为另一个?我希望避免在我的代码中创建大量的foreach循环来处理这么简单的事情。

4
任何执行此操作的实用方法都必须对集合进行迭代,因此您不能期望获得任何性能提升。但是,如果您只是想寻找语法糖,我建议使用Guava或者Apache Collections。 - Sebastian Ganslandt
is bound to iterate of the collection anyway” -- 不是的。请查看我的答案了解详情。 - aioobe
5
在你的特定用例中,你可以通过扩展CrudRepository接口并添加返回Collection<T> / List<T> / Set<T>(根据需要)而不是Iterable<T>的方法来实现。 - Kevin Van Dyck
21个回答

0

您可以使用Eclipse Collections工厂:

Iterable<String> iterable = Arrays.asList("1", "2", "3");

MutableList<String> list = Lists.mutable.withAll(iterable);
MutableSet<String> set = Sets.mutable.withAll(iterable);
MutableSortedSet<String> sortedSet = SortedSets.mutable.withAll(iterable);
MutableBag<String> bag = Bags.mutable.withAll(iterable);
MutableSortedBag<String> sortedBag = SortedBags.mutable.withAll(iterable);

您还可以将 Iterable 转换为 LazyIterable 并使用转换方法或任何其他可用的 API。

Iterable<String> iterable = Arrays.asList("1", "2", "3");
LazyIterable<String> lazy = LazyIterate.adapt(iterable);

MutableList<String> list = lazy.toList();
MutableSet<String> set = lazy.toSet();
MutableSortedSet<String> sortedSet = lazy.toSortedSet();
MutableBag<String> bag = lazy.toBag();
MutableSortedBag<String> sortedBag = lazy.toSortedBag();

以上所有的Mutable类型都扩展了java.util.Collection

注意:我是Eclipse Collections的提交者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接