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


当前回答

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

其他回答

我同意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来说非常简单:

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

在Java 1.8中,流API可用于将列表转换为集合。例如,下面的代码显示了一个列表到一个集合的转换:

List<String> empList = Arrays.asList("java", "python", ".net", "javaScript", "php");
Set<String> set = empList.stream().collect(Collectors.toSet());
set.forEach(value -> System.out.printf("%s ", value));

如果列表包含对象,我想创建一个集合:

List<Employee> empList = Arrays.asList(new Employee(1, 1000, "Chandra Shekhar", 6000),
new Employee(2, 1000, "Rajesh", 8000), new Employee(3, 1004, "Rahul", 9000),
new Employee(4, 1001, "Suresh", 12000), new Employee(5, 1004, "Satosh", 7000));

Set<String> set = empList.stream().map(emp -> emp.getName()).collect(Collectors.toSet());
System.out.println(set);        

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

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

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

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