el map de kotlin agrega valor si no es igual

Tengo un val valuesMap = mutableMapOf<String, String>() Quiero agregar un nuevo valor si las teclas del map no son iguales a IgnoreCase new value.

 if(!valuesMap.keys.equalsIgnoreKeys("value")) { valuesMap.put("value", null) } 

Algo como esto, pero en kotlin solo tenemos el mismo método para las teclas.

¿Por qué no utilizar un map específico para su caso de uso?

 val caseInsensitive = TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER) 

El siguiente constructor se usa aquí:

public TreeMap (Comparador comparador)

Construye un nuevo map de tree vacío, orderado de acuerdo con el comparador dado. Todas las keys insertadas en el map deben ser mutuamente comparables por el comparador dado: comparator.compare (k1, k2) no debe arrojar una ClassCastException para ninguna key k1 y k2 en el map. Si el usuario intenta poner una key en el map que viola esta restricción, la llamada put (Object key, Object value) lanzará una ClassCastException.

Parámetros : comparador: el comparador que se utilizará para solicitar este map. Si es nulo, se usará el order natural de las keys.

necesitas usar containsKey()

 if (!valuesMap.containsKey("value")) { valuesMap.put("value", null) } 

Edite 1 según el enlace en el comentario, puede usar

 String valueByKey = valuesMap.filter { it.key.equals("keyValue", ignoreCase = true) }.map { it.key }.firstOrNull() if(valueByKey==null){ valuesMap.put("keyValue", null) } 

Esto itera a través del set de keys y compara las keys de caja inferior con el término dado (key nueva).

 val map: MutableMap<String, String?> = mutableMapOf() val term = "value" val contains = map.keys.any { key -> key.toLowerCase() == term.toLowerCase() } if (!contains) { map.put(term, null) } 

Si desea agregar una key que aún no se encuentra en el map, puede aplicar un filter a las teclas mediante un pnetworkingicado que minimiza todas las teclas. Si el pnetworkingicado no arroja resultados, puede insert el par; de lo contrario, no.

Algo en la línea:

 private fun addIfNotLowerExists(map: MutableMap<String, String>, candidate: Pair<String, String>) { if (map.filter { s -> s.key.toLowerCase().equals(candidate.first.toLowerCase()) }.keys.isEmpty()) { map[candidate.first] = candidate.second } } 

Aquí hay un ejemplo del código en ejecución:

 fun main(args: Array<String>) { val map = mutableMapOf<String, String>(Pair("k1", "v1"), Pair("K2", "v2")) addIfNotLowerExists(map, Pair("k2", "v2_1")) addIfNotLowerExists(map, Pair("k3", "v3")) println(map) } private fun addIfNotLowerExists(map: MutableMap<String, String>, candidate: Pair<String, String>) { if (map.filter { s -> s.key.toLowerCase().equals(candidate.first.toLowerCase()) }.keys.isEmpty()) { map[candidate.first] = candidate.second } } 

Esto se imprime:

 {k1=v1, K2=v2, k3=v3} 

Como puede ver, el par de valores {k2:v2_1} no está insertado, porque la key K2 ya está en el map.

Sugeriría usar solo las teclas minúsculas en el map; de lo contrario, puedes hacer esto

 valuesMap.keys.map { it.toLowerCase() }.find { it == "value".toLowerCase() } ?: valuesMap.put("value", null) 
  • Referencia de propiedad anidada Kotlin
  • Bloque perezoso Kotlin no ejecutado cuando se usa Mockito e InjectMocks
  • Recruit-MP LightCalendarView - Error al inflar la class, noSuchMethodException
  • Obtenga ClassLoader de gradle org.gradle.api.Project?
  • Kotlin, JPA y campos booleans
  • Mongo Auditing trabaja selectivamente
  • Usar el object compañero para devolver una instancia de la class en Kotlin
  • ¿Alguna forma de henetworkingar de la misma interfaz genérica dos veces (con types separados) en Kotlin?
  • Procesamiento de annotations con kotlin-maven-plugin
  • ¿Qué lenguajes de progtwigción admiten la implementación implícita de la interfaz por delegación?
  • ¿Es posible aplicar una sola anotación a múltiples objectives de sitio de uso en Kotlin?