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());
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 ) .
13 回答
你可以将
List<>
转换为Set<>
让我们不要忘记我们相对较新的朋友java-8 stream API . 如果您需要在将列表转换为集合之前预先处理列表,那么最好具有以下内容:
我会在转换为set之前执行Null检查 .
对于Java 8,它非常简单:
我同意sepp2k,但还有一些其他细节可能很重要:
会给你一个没有重复的未排序集 . 在这种情况下,使用对象上的.equals()方法识别复制 . 这与.hashCode()方法结合使用 . (有关平等的更多信息,请查看here)
给出排序集的替代方法是:
如果Foo实现Comparable,这可以工作 . 如果没有,那么你可能想要使用比较器:
这取决于compareTo()(来自可比较的接口)或compare()(来自比较器)以确保唯一性 . 因此,如果您只关心唯一性,请使用HashSet . 如果您在排序后,请考虑TreeSet . (请记住:稍后进行优化!)如果时间效率很重要,如果空间效率很重要,请使用HashSet,请查看TreeSet . 请注意,通过Trove(和其他位置)可以更有效地实现Set和Map .
如果您使用Guava库:
或更好:
使用java 8你可以使用stream:
或完整的例子
有多种方法可以获得
Set
:当我们使用
Collectors.toSet()
时,它返回一个集合并按照doc:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. 如果我们想得到一个HashSet
那么我们可以使用另一个替代来获得一个集合(检查set3
) .更具Java 8弹性的解决方案
Optional.ofNullable
使用Java 10,您现在可以使用Set#copyOf轻松地将
List<E>
转换为不可修改的Set<E>
:例:
请记住,这是一个无序操作,
null
元素是允许的,因为它会抛出一个NullPointerException
.如果您希望它可以修改,那么只需将它传递给构造函数
Set
实现 .使用构造函数的最佳方法
在java 8中你也可以使用stream api ::