2011-10-31 14 views
9

Mam listę obiektów, każdy obiekt z dwoma polami zainteresowania, które nazwiemy "kluczem" i "wartością". Z tego trzeba zbudować HashMap składające się z wpisów, w których "klucz" mapuje "wartość".Utwórz HashMap w Scali z listy obiektów bez zapętlenia

Wiem, że można tego dokonać, przeglądając listę i wywołując hmap.put(obj.key, obj.value) dla każdej pozycji na liście. Ale jakoś "pachnie" tak, jak to można zrobić w jednym prostym wierszu kodu, używając map lub flatMap lub innej mieszanki operacji list Scala, z funkcjonalną konstrukcją. Czy "pachnąłem" w odpowiedni sposób i jak to się robi?

Odpowiedz

17
list.map(i => i.key -> i.value).toMap 
+4

PO chce 'HashMap' nie jest' Map' – samthebest

+1

Warning: Nie obsługuje duplikatów kluczy! –

8

również:

Map(list map (i => i.key -> i.value): _*) 
+0

Przypuszczam, że zaletą tego jest to, że możesz określić typ mapy, której potrzebujesz, więc jest to bardziej ogólny wzór. –

+1

@LuigiPlinge To prawda. Wolę używać '.toMap', ponieważ jest on znacznie bardziej czytelny. Jeśli wydajność jest bardzo ważna, może użyć 'breakOut'. –

+0

Zgubiłem się z tą ostatnią częścią: _ * rozumiem, że podkreślenie jest zmienną zastępczą dla zmiennej funkcjonalnej, ale nie widzę, w jaki sposób pasuje do tego wyrażenia, ani roli gwiazdki i dwukropka w tym kontekście . – Gigatron

4

Aby utworzyć z kolekcji (nie pamiętam mieć new słowa kluczowego)

val result: HashMap[Int, Int] = HashMap(myCollection: _*)