在Java中将列表转换为集的最简单的方法是什么?


当前回答

不要忘记我们相对较新的朋友,java-8流API。 如果你需要在将列表转换为集合之前对其进行预处理,最好是这样:

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

其他回答

如果你使用Guava库:

Set<Foo> set = Sets.newHashSet(list);

或者,更好:

Set<Foo> set = ImmutableSet.copyOf(list);

在Java 10中,您现在可以使用Set#copyOf轻松地将List<E>转换为不可修改的Set<E>:

例子:

var set = Set.copyOf(list);

请记住,这是一个无序操作,不允许使用空元素,因为它将抛出NullPointerException异常。

如果您希望它是可修改的,那么只需将它传递给构造函数一个Set实现。

如果使用Eclipse Collections:

MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();

MutableIntSet接口扩展了java.util.Set,而MutableIntSet接口没有。您还可以使用Sets工厂类将任何Iterable转换为Set。

Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));

在Eclipse Collections中有更多关于可变工厂的解释。

如果你想从List中获得一个ImmutableSet,你可以像下面这样使用Sets工厂:

ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))

注意:我是Eclipse Collections的提交者

我同意sepp2k,但还有其他一些细节可能很重要:

new HashSet<Foo>(myList);

会给你一个没有重复项的无序集合。在这种情况下,使用对象上的.equals()方法标识复制。这是与. hashcode()方法一起完成的。(更多关于平等的信息请点击这里)

给出一个排序集合的替代方法是:

new TreeSet<Foo>(myList);

如果Foo实现Comparable,这是有效的。如果没有,你可以使用比较器:

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

这取决于compareTo()(来自可比较接口)或compare()(来自比较器)来确保唯一性。如果你只关心唯一性,使用HashSet。如果您正在进行排序,那么请考虑TreeSet。(记住:以后再优化!)如果时间效率很重要,则使用HashSet;如果空间效率很重要,则查看TreeSet。注意,Set和Map的更有效实现可以通过Trove(和其他位置)获得。

使用java 8你可以使用stream:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));