首页 文章

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

提问于
浏览
543

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

13 回答

  • 5

    你可以将 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);
    }
    
  • 933

    让我们不要忘记我们相对较新的朋友java-8 stream API . 如果您需要在将列表转换为集合之前预先处理列表,那么最好具有以下内容:

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

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

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

    对于Java 8,它非常简单:

    List < UserEntity > vList= new ArrayList<>(); 
    vList= service(...);
    Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
    
  • 128
    Set<Foo> foo = new HashSet<Foo>(myList);
    
  • 2

    我同意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

    如果您使用Guava库:

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

    或更好:

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

    使用java 8你可以使用stream:

    List<Integer> mylist = Arrays.asList(100, 101, 102);
    Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
    
  • 6
    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);
            }
        }
    }
    
  • 2

    有多种方法可以获得 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() 时,它返回一个集合并按照doc: There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned . 如果我们想得到一个 HashSet 那么我们可以使用另一个替代来获得一个集合(检查 set3 ) .

  • 21

    更具Java 8弹性的解决方案 Optional.ofNullable

    Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
    
  • 2

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

    例:

    var set = Set.copyOf(list);
    

    请记住,这是一个无序操作, null 元素是允许的,因为它会抛出一个 NullPointerException .

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

  • 9

    使用构造函数的最佳方法

    Set s= new HashSet(list);
    

    在java 8中你也可以使用stream api ::

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

相关问题