Как изменить тип элемента потока с картой в Scala

Я новичок в Scala, и у меня есть вопрос о Stream.map(). Я хочу поток из 12 игроков. Почему я не могу сделать это:

case class Player(number: Int)
Stream.range(1, 12, 1).map[Player](i => new Player(i))

Как правильно использовать функцию карты?
Спасибо за вашу помощь.

Как говорится в сообщении об ошибке: неправильное количество параметров типа. Вы должны написать что-то вроде .map[Player, Stream[Player]](...). Но: 1) Эти типы не нужны. 2) Вам не нужно new для создания экземпляров классов case, .map(Player) будет достаточно. 3) Зачем тебе Stream?

Andrey Tyukin 07.04.2019 16:08
Stream.range(1, 12, 1).map(i => Player(i)) — Просто позвольте компилятору определить тип возвращаемого значения вашего карта. Кроме того, поскольку Игрок является классом case, не используйте new. Наконец, кейс-классы должны быть final
Luis Miguel Mejía Suárez 07.04.2019 16:08

@AndreyTyukin Дело в том, что при нажатии Ctrl+щелчок по map IntelliJ переходит к TraversableOnce.scala, но компилятор не принимает это map с параметром одного типа.

Dmytro Mitin 07.04.2019 16:28
Стоит ли изучать 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
3
431
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытаться

Stream.range(1, 12, 1).map(i => Player(i))

или

Stream.range(1, 12, 1).map[Player, Stream[Player]](i => Player(i))

или

(Stream.range(1, 12, 1) : TraversableOnce[Int]).map[Player](i => Player(i))
Ответ принят как подходящий
  1. Метод map требует два аргумента типа (тип элемента а также — тип возвращаемой коллекции, который может нетривиальным образом зависеть от типа элемента). Оба аргумента обычно опускаются.

  2. Вам не нужно new создавать экземпляры case-классов. Действительно, объект-компаньон Player можно использовать как функцию от Player до Int.

Применение этих двух подсказок дает вам:

Stream.range(1, 12).map(Player)

Однако немного странно, что вы используете Player для крошечной коллекции с фиксированным количеством элементов. Stream или List здесь будет более уместно, так что вы даже можете попробовать что-то вроде

1 to 12 map Player

Если вам интересно, почему Vector принимает параметры типа два, вот несколько примеров:

// return `Iterable` instead of `Stream`
Stream.range(1, 12).map[Player, Iterable[Player]](Player)

// return `Iterable` instead of `Stream` and `Any` instead of `Player`
Stream.range(1, 12).map[Player, Iterable[Any]](Player)

Это создаст значения с указанными типами возврата (например, map вместо Iterable[Player]). Таким образом, аргумент второго типа может использоваться для управления типом возвращаемого значения. Обычно он вам не нужен, и соответствующий тип возвращается автоматически.

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