2017-02-07 29 views
7

W Scala to tylko funkcja map. Na przykład, jeśli jest HashMap HashMap strun, a następnie można wykonać następujące czynności:Idiomatyczny sposób na przekształcenie mapy w kotlinach?

val result : HashMap[String,String] = hashMap.map(case(k,v) => (k -> v.toUpperCase)) 

W Kotlin jednak map obraca mapę w formie listy. Czy w Kotlinie istnieje idiomatyczny sposób robienia tego samego?

+0

Co powiesz na temat 'mapKeys',' mapValues' lub zastosowania 'groupBy' do wyniku prostej' mapy'? – yeputons

+0

@yeputons. Nie wiem Powiedz mi, czy to jest idiomatyczne. Możesz dodać odpowiedź: –

+0

Powinieneś zaakceptować odpowiedź z @ James-bassett. –

Odpowiedz

11

Nie sądzę czyjaś opinia liczy się jako idiomatyczne, ale pewnie bym użyć

// transform keys only (use same values) 
hashMap.mapKeys { it.key.toUpperCase() } 

// transform values only (use same key) - what you're after! 
hashMap.mapValues { it.value.toUpperCase() } 

// transform keys + values 
hashMap.entries.associate { it.key.toUpperCase() to it.value.toUpperCase() } 
+1

To też powinienem zrobić, chociaż jeśli tylko transformujesz wartości, możesz zamiast tego użyć 'mapValues' (np.' HashMap.mapValues ​​{it.value .toUpperCase()} ') ale osobiście nie podoba mi się podpis' mapValues', ponieważ używa 'transform: (Map.Entry ) -> R' zamiast' transform: (V) -> R' który wydaje się dla mnie niezgodne z 'filterValues ​​(predicate: (V) -> Boolean)' co oznacza, że ​​nie możesz napisać 'hashMap.mapValues ​​(String :: toUpperCase)' tak po prostu używam 'hashMap.entries.associate {... } '. – mfulton26

+0

Zaktualizowano, aby zawrzeć również 'mapValues ​​()', dzięki @ mfulton26 –

0

Można użyć stdlib mapValues function że inni sugerowali:

hashMap.mapValues { it.value.toUpperCase() } 

Wierzę, że to jest najbardziej idiomatyczny sposób.

0

Znalazłem inny wariant. Wydaje się być bardziej zrozumiały. Będzie on automatycznie określać rodzaj mapy wynikowej. Wymagane jest użycie operatora

.toTypedArray().