У меня есть код, который раньше работал в 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» или как заставить его преобразовать в «нормальную» карту?
@LuisMiguelMejíaSuárez Это помогло! Пожалуйста, позвольте мне наградить вас интернет-баллами. Если бы вы могли, сделайте свой комментарий ответом, и я выберу его.
Это само по себе не стоит того, чтобы отвечать, и я почти уверен, что вопрос будет закрыт либо как «вызванный опечаткой», либо как дубликат, который мне лень искать: p - В любом случае, я рад этому помогло :)
@LuisMiguelMejíaSuárez меня удивляет, что они изменили тип возврата и пометили его как устаревший. По сути, это нарушает функциональность между 2.12 и 2.13, так что на самом деле они могли просто удалить функцию целиком, поскольку она даже не возвращает тот же тип, что и раньше.
Что ж, 2.13
ломает много вещей, как и любой другой крупный выпуск Scala.
Вам это помогает? MapView(<не вычисляется>) в Scala
Как отметил комментатор, тип возвращаемого значения mapValues(f)
изменился между Scala 2.12
и 2.13
. Код для исправления:
sender ! chunkRepo.getChunksWithSubtitlesByDistribution(distributionId, state)
.right.map(_**.view**.mapValues(_.sortWith((a, b) => a.start < b.start) )**.toMap** )
**измененный код**
_.mapValues
в2.13
возвращает представление и устарело. Замени на.view.mapValues(f).toMap