用 Iterable 初始化一个 Set

新手上路,请多包涵

我想用 Iterable 在 Java 中初始化一个 Set Implementation (HashSet)。但是,HashSet 的构造函数不接受 Iterables,只接受 Collections 类型的对象。

有没有一种方法可以从 Iterable 转换为 Collections 的某些子类型。

原文由 VaidAbhishek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

HashSet constructor relies on more than what Iterable offers: it wants to know the size of the collection up front in order to optimally construct the underlying HashMap 。如果你有一个真正的、朴素的 Iterable ,它不知道它的大小,那么你必须预先意识到 Iterable 把它变成一个普通的 Collection 以多种显而易见的方式中的任何一种。

另一方面,如果你有一个已经知道它的大小的更丰富的对象,那么创建一个将你的 Iterable 包装到一个集合中的极简适配器类是值得的,只实现 size 除了将呼叫转接至 iterator

 public class IterableCollection<T> implements Collection<T>
{
   private final Iterable<T> iterable;

   public IterableCollection(Iterable<T> it) { this.iterable = it; }

   @Override public Iterator<T> iterator() { return iterable.iterator(); }

   @Override public int size() { return ... custom code to determine size ... }

   @Override .... all others ... { throw new UnsupportedOperationException(); }
}

原文由 Marko Topolnik 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以使用 番石榴

 Set<T> set = Sets.newHashSet(iterable);

或者让它读起来像一个静态导入的句子,

 import static com.google.common.collect.Sets.*;

Set<T> set = newHashSet(iterable);

原文由 ConnorWGarvey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏