将List转换为Java中的Set的最简单方法

时间:2009-09-15 22:02:36

标签: java collections

在Java中将List转换为Set的最简单方法是什么?

16 个答案:

答案 0 :(得分:987)

Set<Foo> foo = new HashSet<Foo>(myList);

答案 1 :(得分:134)

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

new HashSet<Foo>(myList);

会给你一个没有重复的未排序集。在这种情况下,使用对象上的.equals()方法识别复制。这与.hashCode()方法结合使用。 (有关平等的更多信息,请查看here

提供有序集的替代方法是:

new TreeSet<Foo>(myList);

如果Foo实现了Comparable,这是有效的。如果没有,那么你可能想要使用比较器:

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

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

答案 2 :(得分:66)

如果您使用Guava库:

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

或者,更好:

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

答案 3 :(得分:24)

使用java 8可以使用stream:

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

答案 4 :(得分:16)

Set<E> alphaSet  = new HashSet<E>(<your List>);

或完整示例

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListToSet
{
    public static void main(String[] args)
    {
        List<String> alphaList = new ArrayList<String>();
        alphaList.add("A");
        alphaList.add("B");
        alphaList.add("C");
        alphaList.add("A");
        alphaList.add("B");
        System.out.println("List values .....");
        for (String alpha : alphaList)
        {
            System.out.println(alpha);
        }
        Set<String> alphaSet = new HashSet<String>(alphaList);
        System.out.println("\nSet values .....");
        for (String alpha : alphaSet)
        {
            System.out.println(alpha);
        }
    }
}

答案 5 :(得分:9)

我会在转换为set之前执行Null检查。

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

答案 6 :(得分:6)

您可以将List<>转换为Set<>

Set<T> set=new HashSet<T>();

//Added dependency -> If list is null then it will throw NullPointerExcetion.

Set<T> set;
if(list != null){
    set = new HashSet<T>(list);
}

答案 7 :(得分:6)

对于Java 8,它非常简单:

List < UserEntity > vList= new ArrayList<>(); 
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());

答案 8 :(得分:5)

让我们不要忘记我们相对较新的朋友流API。 如果您需要在将列表转换为集合之前对其进行预处理,那么最好有以下内容:

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

答案 9 :(得分:3)

有多种方法可以将Set作为:

    List<Integer> sourceList = new ArrayList();
    sourceList.add(1);
    sourceList.add(2);
    sourceList.add(3);
    sourceList.add(4);

    // Using Core Java
    Set<Integer> set1 = new HashSet<>(sourceList);  //needs null-check if sourceList can be null.

    // Java 8
    Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
    Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));

    //Guava
    Set<Integer> set4 = Sets.newHashSet(sourceList);

    // Apache commons
    Set<Integer> set5 = new HashSet<>(4);
    CollectionUtils.addAll(set5, sourceList);

当我们使用Collectors.toSet()时,它会根据文档There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned返回一个集合。如果我们想获得HashSet,那么我们可以使用其他替代方法来获取集合(检查set3)。

答案 10 :(得分:3)

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

示例:

var set = Set.copyOf(list);

请注意,这是一项无序操作,null元素允许,因为它会抛出NullPointerException

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

答案 11 :(得分:3)

Java - addAll

set.addAll(aList);

Java -新对象

new HashSet(list)

Java-8

list.stream().collect(Collectors.toSet());

使用Guva

 Sets.newHashSet(list)

Apache Commons

CollectionUtils.addAll(targetSet, sourceList);

答案 12 :(得分:2)

具有Optional.ofNullable

的更具Java 8弹性的解决方案
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);

答案 13 :(得分:2)

使用构造函数的最佳方法

Set s= new HashSet(list);

在Java 8中,您还可以使用流api ::

Set s= list.stream().collect(Collectors.toSet());

答案 14 :(得分:1)

如果您使用Eclipse Collections

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

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

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

Eclipse集合here中提供了关于可变工厂的更多解释。

如果您想从ImmutableSet中获得List,则可以如下使用Sets工厂:

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

注意:我是Eclipse Collections的提交者

答案 15 :(得分:1)

请记住,从List转换为Set将删除集合中的重复项,因为List支持重复项,但是Set不支持Java中的重复项。

直接转换::将列表转换为集合的最常见,最简单的方法

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Converting a list to set
Set<String> set = new HashSet<>(list);

Apache Commons Collections::您还可以使用Commons Collections API将列表转换为Set:-

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Creating a set with the same number of members in the list 
Set<String> set = new HashSet<>(4);

// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);

使用流:另一种方法是将给定列表转换为流,然后将流转换为设置:-

// Creating a list of strings 
List<String> list = Arrays.asList("One", "Two", "Three", "Four"); 

// Converting to set using stream 
Set<String> set = list.stream().collect(Collectors.toSet());