有没有更好的方法在java中组合两个字符串集?

Foo*_*Bar 74 java

我需要结合两个字符串集,同时过滤掉冗余信息,这是我提出的解决方案,有没有更好的方法,任何人都可以建议?也许是我忽视的东西?谷歌没有运气.

Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();

for(String currentString : oldStringSet)
{
    if (!newStringSet.contains(currentString))
    {
        newStringSet.add(currentString);
    }
}
Run Code Online (Sandbox Code Playgroud)

dac*_*cwe 108

由于a Set不包含重复条目,因此您可以将两者结合起来:

newStringSet.addAll(oldStringSet);
Run Code Online (Sandbox Code Playgroud)

如果你添加两次东西并不重要,该集合将只包含一次元素...例如,它不需要检查使用contains方法.


ytt*_*rrr 70

你可以使用这个单线程来做到这一点

Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream())
        .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

使用静态导入它看起来更好

Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream())
        .collect(toSet());
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用flatMap方法:

Set<String> combined = Stream.of(newStringSet, oldStringSet).flatMap(Set::stream)
        .collect(toSet());
Run Code Online (Sandbox Code Playgroud)

此外,任何集合都可以轻松地与单个元素组合

Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue))
        .collect(toSet());
Run Code Online (Sandbox Code Playgroud)

  • @KKlalala,您的要求将决定哪个更好.`addAll`和使用Streams之间的主要区别是:•使用`set1.addAll(set2)`会产生物理上改变`set1`内容的副作用.•但是,使用Streams将始终生成包含两个集的内容的"Set"的新实例,而无需修改任何原始Set实例.恕我直言,这个答案更好,因为它避免了副作用和原始集的意外变化的可能性,如果它在其他地方使用同时期望原始内容.HTH (6认同)
  • 这还有支持不可变集的优点。请参阅:https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifyingSet-java.util.Set- (4认同)

pro*_*e-e 23

番石榴一样:

Set<String> combinedSet = Sets.union(oldStringSet, newStringSet)
Run Code Online (Sandbox Code Playgroud)

  • Sets :: union是一个很棒的BinaryOperator,可与Collectors.reducing()一起使用。 (2认同)

Dam*_*ash 11

从定义Set仅包含唯一元素.

Set<String> distinct = new HashSet<String>(); 
 distinct.addAll(oldStringSet);
 distinct.addAll(newStringSet);
Run Code Online (Sandbox Code Playgroud)

要增强代码,您可以为此创建一个通用方法

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;
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*des 8

如果您使用 Guava,您还可以使用构建器来获得更大的灵活性:

ImmutableSet.<String>builder().addAll(someSet)
                              .addAll(anotherSet)
                              .add("A single string")
                              .build();
Run Code Online (Sandbox Code Playgroud)


Vin*_*nki 7

如果您使用的是 Apache Common,请使用SetUtils来自org.apache.commons.collections4.SetUtils;

SetUtils.union(setA, setB);
Run Code Online (Sandbox Code Playgroud)