使用可迭代初始化集

2022-09-01 19:46:04

我想用一个可迭代的在Java中初始化一个集合实现(HashSet)。但是,HashSet 的构造函数不接受可迭代对象,而只接受集合类型对象。

有没有办法从可迭代转换为集合的某个子类型。


答案 1

你可以使用番石榴

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

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

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

Set<T> set = newHashSet(iterable);

答案 2

HashSet构造函数依赖于比提供的内容更多的内容:它希望预先了解集合的,以便以最佳方式构造底层 。如果你有一个真正的,朴素的 ,它不知道它的大小,那么你必须通过以许多明显的方式将其变成常规来实现前期。IterablesizeHashMapIterableIterableCollection

另一方面,如果您有一个已经知道其大小的更丰富的对象,那么创建一个将您包装到集合中的极简适配器类将是值得的,除了将调用转发到 之外,还实现了。Iterablesizeiterator

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(); }
}

推荐