Создать карту из элементов из списка класса case

      case class Student(id:String, name:String, teacher:String )
      val myList = List( Student("1","Ramesh","Isabela"), Student("2","Elena","Mark"),Student("3","invalidKey","Someteacher"))
      
      val a = myList.foreach( i=> (i.name ->  i.teacher)).toMap.filter(i.name != "invalidKey")

У меня есть список кейс-класса студента. Я хочу построить карту ученика, учителя, имя которой (ключ карты) всегда будет уникальным. Предпочтительно карта может отфильтровывать определенное имя.

Добавьте toMap в конце. и убери println

Luis Miguel Mejía Suárez 13.05.2022 20:47

Вы можете использовать collect вместо map + filter

Luis Miguel Mejía Suárez 13.05.2022 20:54

Я не получаю элементы от итератора i . вот в чем проблема

CoolGoose 13.05.2022 20:59

Что ж, поскольку вы используете foreach вместо map, если вы проверите подписи типов и прочитаете документацию, станет ясно, почему это не сработает: scala-lang.org/api/current/scala/collection/immutable/List.h‌​tml — В любом случае, все, что вам нужно, это: scastie.scala-lang.org/BalmungSan/mEEDnPQ0TcWAwE8lcz9EIg/2

Luis Miguel Mejía Suárez 13.05.2022 21:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете foreach, который возвращает Unit в качестве результата. Я бы предложил любой из этих 2 ниже. Первый, как упомянул Луис Мигель:

val myMap = myList.collect {
  case student if student.name != "invalidKey" => student.name -> student.teacher
}.toMap

Или:

val myMap2 = myList.foldLeft[Map[String, String]](Map.empty) {
  case (elementsMap, newElement) if newElement.name != "invalidKey" => 
    elementsMap + (newElement.name -> newElement.teacher)
  case (elementsMap, _) => elementsMap
}

Отличия:

Первый подход намного легче читать и короче (хотя короче не является преимуществом: D). Второй имеет меньше итераций (у первого есть еще одна итерация для преобразования в карту).

Вы можете просто добавить view перед collect, и теперь первый из них повторяется только один раз... но на самом деле это может быть медленнее для небольших коллекций; преждевременная оптимизация — корень всех зол.

Luis Miguel Mejía Suárez 13.05.2022 22:05

Кстати, то, что я имел в виду под «имеет на одну итерацию меньше», заключается не в том, что у него лучший порядок алгоритма с точки зрения временной сложности, они оба считаются O (n).

AminMal 13.05.2022 22:07

@LuisMiguelMejíaSuárez, Интересно! Я этого не знал. вы можете отредактировать ответ :)

AminMal 13.05.2022 22:08

@LuisMiguelMejíaSuárez, я просмотрел представления, а также прочитал некоторые версии реальных исходных кодов и обнаружил, что это в значительной степени зависит от реализации SeqView. В некоторых версиях представление содержит конструктор типов, и когда вы хотите преобразовать список в карту, представление принудительно оценивается (что приводит к списку[...]), а затем преобразуется в карту (эта одна дополнительная итерация) . а в более новых версиях view избавляется от конструктора типов, а преобразование в карту выполняется с помощью Map.from(iterable) (я не уверен, есть ли в этом дополнительная итерация). (остальная часть комментария в следующем).

AminMal 14.05.2022 00:39

В обоих случаях (обе реализации), я думаю, что второй подход (свертывание) займет меньше или равно первому (представление). Я прав?

AminMal 14.05.2022 00:40

Да, Views до 2.13 в основном бесполезны, я в основном игнорирую их существование до 2.13, и да, foldLeft всегда должен быть как минимум таким же эффективным. Но опять же, чтобы на самом деле ответить, что нужно правильно оценивать производительность, лучше всего оптимизировать читаемость и заботиться о производительности только тогда, когда это действительно важно.

Luis Miguel Mejía Suárez 14.05.2022 00:42

@LuisMiguelMejíaSuárez, я согласен, я недавно опубликовал вопрос на обмен стеками codereview, который касается именно этой темы (читабельность и т. д.). Не могли бы вы взглянуть?

AminMal 14.05.2022 00:46

Для этого вопроса я, вероятно, сначала посмотрел бы, предоставляет ли фс2 что-то, если нет, я бы использовал State и traverse из кошки.

Luis Miguel Mejía Suárez 14.05.2022 01:53

Другие вопросы по теме