关于集合:将List转换为Java集合的最简单方法

Easiest way to convert a List to a Set in Java

在Java中,将EDCOX1的0度转换为EDCOX1×1的最简单的方法是什么?


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


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

1
new HashSet<Foo>(myList);

将给您一个没有排序的集合,该集合没有重复项。在本例中,重复是使用对象上的.equals()方法标识的。这是结合.hashcode()方法完成的。(更多关于平等的信息,请看这里)

提供排序集的另一种方法是:

1
new TreeSet<Foo>(myList);

如果foo实现了可比性,这是可行的。如果没有,那么您可能需要使用比较器:

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

这取决于compareTo()(来自可比较接口)或compare()(来自comparator)以确保唯一性。因此,如果您只关心唯一性,那么就使用哈希集。如果您正在排序,那么考虑树集。(记住:以后再优化!)如果时间效率很重要,请使用哈希集如果空间效率很重要,请查看treeset。请注意,通过trove(和其他位置)可以更有效地实现集合和映射。


如果您使用了番石榴图书馆:

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

或者,更好:

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


使用Java 8可以使用流:

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


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

或者完整的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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("
Set values ....."
);
        for (String alpha : alphaSet)
        {
            System.out.println(alpha);
        }
    }
}


我将在转换为set之前执行空检查。

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


对于Java 8来说非常简单:

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


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

1
2
3
4
5
6
7
8
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);
}


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

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

爪哇-阿达尔

1
set.addAll(aList);

新对象

1
new HashSet(list)

JAVA-8

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

使用古瓦

1
 Sets.newHashSet(list)

阿帕奇公地

1
CollectionUtils.addAll(targetSet, sourceList);

使用Java 10,您现在可以使用EDCOX1(8)来轻松地将EDCOX1的9度转换为不可修改的EDOCX1 10。

例子:

1
var set = Set.copyOf(list);

记住,这是一个无序操作,不允许使用null元素,因为它会抛出NullPointerException

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


有多种方法可以得到一个Set,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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)。


使用构造函数的最佳方法

1
Set s= new HashSet(list);

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

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

一个具有EDCOX1和7的Java 8弹性解决方案

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