Scala.collection.MapView$MapValues ​​нельзя преобразовать в scala.collection.immutable.Map

У меня есть код, который раньше работал в Scala 2.12, но теперь не работает в 2.13.

По сути, мои звонки выглядят так:

Controller -> Service -> Actor -> Repo

Мой контроллер выглядит так:

complete {
  dep.chunkService.getChunksWithSubtitlesByDistribution(id, chunkState).map(
    _.right.map(
    chunkMap => StatusResult(
                  Meta(OK),
                  chunkMap.extractChunkDtoList,
                  chunkMap.extractSubtitleDtoList)): ToResponseMarshallable)
}

И ошибка, которую я получаю:

scala.collection.MapView$MapValues ​​нельзя преобразовать в scala.collection.immutable.Map

Это происходит на этой строке контроллера:

  chunkMap => StatusResult(

Метод службы, вызываемый контроллером, имеет сигнатуру:

def getChunksWithSubtitlesByDistribution(distributionId: UUID, state: Option[ChunkState]): 
        Future[Either[DistributionNotFoundError, Map[Chunk, List[Subtitle]]]]

Служба устанавливает Актера, который делает вызов Репо следующим образом:


sender ! chunkRepo.getChunksWithSubtitlesByDistribution(distributionId, state).right.map(_.mapValues(_.sortWith((a, b) => a.start < b.start) ) )

Это то значение, которое будет возвращено chunkService.getChunksWithSubtitlesByDistribution

chunkRepo.getChunksWithSubtitlesByDistribution возвращает это:

result match {
   case Nil => Left(DistributionNotFoundError(distributionId))
   case rs =>
     Right(
       rs.flatten
         .groupBy { case (c, s) => c }
           .mapValues(pairs => pairs.map { case (c, ss) => ss }.flatten)
           .toMap
     )
}

Не знаете, где в цепочке вступает в действие «MapView» или как заставить его преобразовать в «нормальную» карту?

_.mapValues в 2.13 возвращает представление и устарело. Замени на .view.mapValues(f).toMap
Luis Miguel Mejía Suárez 14.12.2020 22:37

@LuisMiguelMejíaSuárez Это помогло! Пожалуйста, позвольте мне наградить вас интернет-баллами. Если бы вы могли, сделайте свой комментарий ответом, и я выберу его.

ThaDon 14.12.2020 23:00

Это само по себе не стоит того, чтобы отвечать, и я почти уверен, что вопрос будет закрыт либо как «вызванный опечаткой», либо как дубликат, который мне лень искать: p - В любом случае, я рад этому помогло :)

Luis Miguel Mejía Suárez 14.12.2020 23:05

@LuisMiguelMejíaSuárez меня удивляет, что они изменили тип возврата и пометили его как устаревший. По сути, это нарушает функциональность между 2.12 и 2.13, так что на самом деле они могли просто удалить функцию целиком, поскольку она даже не возвращает тот же тип, что и раньше.

ThaDon 15.12.2020 00:25

Что ж, 2.13 ломает много вещей, как и любой другой крупный выпуск Scala.

Luis Miguel Mejía Suárez 15.12.2020 04:26

Вам это помогает? MapView(<не вычисляется>) в Scala

Tomer Shetah 15.12.2020 07:10
Стоит ли изучать 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
6
507
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как отметил комментатор, тип возвращаемого значения mapValues(f) изменился между Scala 2.12 и 2.13. Код для исправления:

sender ! chunkRepo.getChunksWithSubtitlesByDistribution(distributionId, state)
  .right.map(_**.view**.mapValues(_.sortWith((a, b) => a.start < b.start) )**.toMap** )

**измененный код**

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