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

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

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

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

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

Intereting Posts
Экземпляр фрагмента сохраняется, но дочерний фрагмент не повторно прикреплен Мне просто не кажется, что мой Kotlin Recycler Multiple View Code разобрался Как делиться PDF-файлами через почтовые приложения и Google Диском без Drive API? Kotlin val различие getter override vs assign Момент не может быть сериализован в соответствующий формат даже с помощью jackson-datatype-jsr310 Лучший способ комбинировать целые флаги с использованием Kotlin? между объектом и GoogleMap в kotlin Как избежать частичного покрытия латинскими полями в Котлине Как получить значение свойства с отражением Отражение Котлина + дженерики Как использовать библиотеку многократного использования в kotlin, с андроидом и javascript? Сопоставление вложенных коллекций с аннотациями JPA спящего режима? Карта <Key, Set <Значение >> Ожидаемое несоответствие типа с выражением в Котлине Точное определение «функционального интерфейса» в Java 8 Кнопка Android Kotlin + диалог + список + список