Как использовать `filterValues` на вложенной итерации Hashmap в Котлин?

Я пытаюсь выполнить итерацию через вложенный Hashmap в более функциональном стиле, используя Kotlin. В частности, у меня есть два экземпляра 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; 

Вот моя попытка функционального эквивалента в Котлине:

 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 на том, как правильно это сделать, используя filterValues . Как выглядит правильное решение в Котлине?

Solutions Collecting From Web of "Как использовать `filterValues` на вложенной итерации Hashmap в Котлин?"

Проблема здесь в том, что это фильтр состояния, означающий, что решение поместить элемент в конечный результат зависит от предыдущих обработанных элементов. Функциональные фильтры должны быть безстоящими, поэтому решение о добавлении элемента одинаково независимо от порядка обработки элементов.

Тем не менее, я думаю, что вся логика немного многословна.

Вы можете переписать версию 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; 

Который намного короче и делает то же самое.

Тем не менее, он по-прежнему неактивен из-за того, что внешние pairs проверяются с помощью containsKey .

Мне интересно, какой ожидаемый результат функции будет в этом случае:

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

Не могли бы вы добавить ожидаемый результат? У меня такое впечатление, что функция испорчена.