有没有更好的方法来结合在Java中的两个string集?

我需要将两个string集合在一起,同时过滤出冗余信息,这是我提出的解决scheme,有没有更好的方法,任何人都可以build议? 也许是我所忽视的东西? 没有任何运气与谷歌。

Set<String> oldStringSet = getOldStringSet(); Set<String> newStringSet = getNewStringSet(); for(String currentString : oldStringSet) { if (!newStringSet.contains(currentString)) { newStringSet.add(currentString); } } 

由于一个Set不包含重复的条目,因此可以通过以下方式组合这两个条目:

 newStringSet.addAll(oldStringSet); 

不要紧,如果你添加的东西两次,该集将只包含元素一次…例如,它不需要检查使用contains方法。

你可以用这个一行代码来做到这一点

 Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream()) .collect(Collectors.toSet()); 

静态导入它看起来更好

 Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream()) .collect(toSet()); 

任何集合都可以很容易地与一个单一的元素相结合

 Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue)) .collect(toSet()); 

从定义集合只包含唯一的元素。

 Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet); 

为了增强你的代码,你可以为它创build一个通用的方法

 public static <T> Set<T> distinct(Collection<T>... lists) { Set<T> distinct = new HashSet<T>(); for(Collection<T> list : lists) { distinct.addAll(list); } return distinct; } 

只需使用newStringSet.addAll(oldStringSet) 。 没有必要检查重复,因为Set实现已经这样做了。

http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection

由于集合不能有重复,只要将一个元素的所有元素添加到另一个元素就会生成两者的正确联合。

Set.addAll()

将指定集合中的所有元素添加到此集(如果它们尚不存在)(可选操作)。 如果指定的集合也是一个集合,则addAll操作会有效地修改该集合,使其值为两个集合的集合

newStringSet.addAll(oldStringSet)

使用boolean addAll(Collection<? extends E> c)
将指定集合中的所有元素添加到此集(如果它们尚不存在)(可选操作)。 如果指定的集合也是集合,则addAll操作将有效地修改此集合,使其值为两个集合的并集。 如果指定的集合在操作过程中被修改,则此操作的行为是未定义的。

 newStringSet.addAll(oldStringSet) 
  newStringSet.addAll(oldStringSet); 

这将产生s1和s2的联盟

与番石榴一样 :

 Set<Sting> combinedSet = Sets.union(oldStringSet, newStringSet)