将HashMap的键和值组合到Set

Pro*_*zac 2 java java-8 java-stream

我有一个HashMap<Integer, Integer>,唯一键可以有重复的值.有没有办法将HashMap转换为Set<Integer>包含键和值的唯一整数的HashMap .

通过迭代keySet()和.values(),这绝对可以在两个循环中完成.我想知道这是否可以在java 8流中使用.

Fer*_*big 7

您可以使用stream函数组合值和键:

Map<Integer, Integer> map = ...
Set<Integer> total = Stream.concat(
     map.keySet().stream(), 
     map.values().stream()
).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

这使用地图keySet().stream()values().stream()获取两者的流,然后使用它们连接它们Stream.concat,然后最终将它变成一个集合.调用以.toSet()防止重复元素,因为一个集合不能包含重复元素.

如果键是double,并且值是浮点数,也可以使用此技巧,在这种情况下,java将返回最大的公共分隔符类,在这种情况下是Number.

  • @YassinHajaj我更喜欢[JB Nizet的回答](http://stackoverflow.com/a/35646442/464306).它更干净,更干燥,只在地图上迭代一次. (2认同)
  • 当键是double,并且值是浮点数时,由于对象类型不同,相同的数字被认为是不相等的.我怀疑是否存在需要这种情况的用例. (2认同)