¿Cómo uso `filterValues` en la anotación de Hashmap anidada en Kotlin?

Estoy tratando de iterar a través de un Hashmap nested en un estilo más funcional usando Kotlin. En particular, tengo dos instancias de HashMap (ambas de tipo Map<String, Integer> ) y quiero hacer coincidir sus valores según algunos criterios. Aquí está el método de Java de lo que quiero lograr:

 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; 

Aquí está mi bash de equivalente funcional en 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 } 

Estoy atascado en cómo hacer esto correctamente usando filterValues . ¿Cómo se ve la solución correcta en Kotlin?

El problema aquí es que se trata de un filter con estado, lo que significa que la decisión de poner un elemento en el resultado final depende de los elementos previos procesados. Los filters funcionales deben ser sin estado, por lo que la decisión de agregar un elemento es la misma, independientemente del order en que se procesen los elementos.

Sin embargo, creo que toda la lógica es un poco detallada.

Podrías reescribir la versión de Java así:

 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; 

Que es mucho más corto y hace lo mismo.

Sin embargo, sigue siendo estable debido a que los pairs maps externos se comtestingn con containsKey .

Sin embargo, me pregunto cuál será el resultado esperado de la function en este caso:

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

¿Podría agregar el resultado esperado? Tengo la printing de que la function es defectuosa.

  • Hibernate @OneToMany join table arroja StackOverflowException
  • Formatee Kotlin String con múltiples ocurrencias
  • Cómo el aceptador puede agregar valor al estado y devolverlo al iniciador
  • Sobrecarga de setter en Kotlin
  • Código compartido entre el server de Kotlin y los proyectos del cliente usando Gradle
  • ¿Manera de Kotlin de filtrar valores máximos de 2 arrays?
  • Asignación no permitida en la expresión while?
  • Filtro de list dentro del range externo - KOTLIN
  • Obtener error de instancia en kotlin: conversión inteligente a 'tipo' es imposible
  • Convirtiendo un Observable en un Flujo con contrapresión en RxJava2
  • Los types comodín generics no son compatibles