Создайте хэш-карту в Scala из списка объектов без зацикливания

#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: _*)