如何在Java中连接两个可空集

T_R*_*Rex 3 java map set

我有两个以String作为键的映射,并将Set设置为其值.这两个地图可以共享相同的密钥.如果两个映射具有相同的密钥,我正在尝试将两个Set值合并在一起.问题是,第二个映射可能为null,并且由于并非所有键都在两个映射之间共享,因此Sets也可能为null.我想出了几个选项,但它们看起来都很混乱.想知道是否有人有更高效/更漂亮的方式.这是我到目前为止:

Set<String> mergedSet = (firstMap.containsKey(commonKey)) ? firstMap.get(commonKey) : new HashSet<String>();

mergedSet.addAll(secondMap != null && secondMap.containsKey(commonKey) ? secondMap.get(commonKey) : new HashSet<String>());

JB *_*zet 5

我会使用Guava的HashMultimap而不是Map<String, Set<String>>.它具有以下优点:

  • 用于为给定键添加多个值的快捷方法,如果此键不存在,则无需关心
  • get(key)调用时始终返回非null Set ,即使此键没有存储任何内容.

所以你的代码将成为:

Set<String> mergedSet = Sets.union(firstMultimap.get(commonKey),
                                   secondMultimap.get(commonKey));
Run Code Online (Sandbox Code Playgroud)

该集合将简单地是两个集合的视图,这避免了复制每个元素.但如果你想要一份副本,那就去做吧

Set<String> mergedSet = Sets.newHashSet(Sets.union(firstMultimap.get(commonKey),
                                                   secondMultimap.get(commonKey)));
Run Code Online (Sandbox Code Playgroud)

如果您不想使用外部库,那么您的代码就可以了.我会使用Collections.singletonSet()第二个回退设置,以避免不必要的空集创建.并且要小心:您的代码修改了第一组.它没有复制它.所以最后,第一张地图的每一组实际上都是一个合并的集合.