如何在Kotlin的嵌套Hashmap迭代中使用`filterValues`?

我正在尝试使用Kotlin以更实用的风格迭代嵌套的Hashmap。 特别是,我有两个HashMap实例(都是Map<String, Integer> ),我想根据一些条件匹配它们的值。 这是我想要实现的Java方法:

 Map<Integer, Integer> pairs = new LinkedHashMap<>(); for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) { for (Map.Entry<String, Integer> newImages : finalImageMap.entrySet()) { Integer oldImageVal = oldImages.getValue(); Integer newImageVal = newImages.getValue(); boolean containsNewType = pairs.containsKey(newImageVal) && pairs.get(newImageVal).intValue() == oldImageVal.intValue(); boolean urlsMatch = newImages.getKey().equals(oldImages.getKey()); if (!containsNewType && urlsMatch) { pairs.put(oldImageVal, newImageVal); } } } return pairs; 

这是我在Kotlin的功能等同的尝试:

 private val swapPairs: Map<Int, Int> get() { val pairs = LinkedHashMap<Int, Int>() startingImageMap.forEach { val finalImageMap = finalImageMap.filterValues { val containsNewType = pairs.containsKey(it) && pairs[it] == startingImageMap[it] val urlMatch = it == startingImageMap[it] return !containsNewType && urlsMatch }.values.first() } return pairs } 

我被困在如何正确使用filterValues 。 在Kotlin中正确的解决方案是什么样的?

这里的问题是,这是一个有状态的过滤器,这意味着将元素放入最终结果的决定取决于之前处理的元素。 功能过滤器应该是无状态的,所以添加元素的决定是相同的,无论元素的处理顺序如何。

不过,我认为整个逻辑有点冗长。

你可以像这样重写Java版本:

 Map<Integer, Integer> pairs = new LinkedHashMap<>(); for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) { Integer oldImageVal = oldImages.getValue(); Integer newImageVal = finalImageMap.get(oldImages.getKey()); if (newImageVal != null) { boolean containsNewType = pairs.containsKey(newImageVal) && pairs.get(newImageVal).intValue() == oldImageVal.intValue(); if (!containsNewType) { pairs.put(oldImageVal, newImageVal); } } } return pairs; 

哪个更短,做同样的事情。

但是,由于使用containsKey检查外部映射pairs ,它仍然是有状态的。

我想知道在这种情况下函数的预期输出是什么:

  old new A: 1 A: 5 B: 2 B: 2 C: 3 C: 3 D: 4 E: 8 H: 9 F: 9 G: 3 

你能添加预期的结果吗? 我觉得这个功能是有缺陷的。