#list #scala #hashmap
#Список #scala #хэш-карта
Вопрос:
У меня есть список объектов, каждый объект с двумя интересующими полями, которые я назову «ключ» и «значение». Исходя из этого, мне нужно создать хэш-карту, состоящую из записей, где «ключ» соответствует «значению».
Я знаю, что это можно сделать, просматривая список и вызывая каждый элемент в списке. hmap.put(obj.key, obj.value)
Но почему-то это «пахнет» так, как будто это можно сделать в одной простой строке кода, используя map
или flatMap
или какое-то другое сочетание операций со списком Scala, с функциональной конструкцией. Правильно ли я «пахну» и как это будет сделано?
Ответ №1:
list.map(i => i.key -> i.value).toMap
Комментарии:
1. OP хочет
HashMap
, чтобы неMap
2. Предупреждение: он не поддерживает дублированные ключи!
Ответ №2:
Также:
Map(list map (i => i.key -> i.value): _*)
Комментарии:
1. Я полагаю, преимущество этого заключается в том, что вы можете указать нужный вам тип карты, поэтому это более общий шаблон
2. @LuigiPlinge Это правда. Я предпочитаю использовать
.toMap
, так как он намного более удобочитаем. Если производительность вызывает большую озабоченность, возможно , используйтеbreakOut
.3. Я запутался в этой последней части: _ * Я понимаю, что подчеркивание является заполнителем для функциональной переменной, но я не вижу, как оно вписывается в это выражение, а также роль звездочки и двоеточия в этом контексте.
4. Хорошо, теперь я понял. Map.apply с помощью varargs .
5. Примечание: он не поддерживает дублированные ключи!
Ответ №3:
Для создания из коллекции (не забудьте new
указать ключевое слово)
val result: HashMap[Int, Int] = HashMap(myCollection: _*)