Я новичок в Scala, и у меня есть вопрос о Stream.map(). Я хочу поток из 12 игроков. Почему я не могу сделать это:
case class Player(number: Int)
Stream.range(1, 12, 1).map[Player](i => new Player(i))
Как правильно использовать функцию карты?
Спасибо за вашу помощь.
Stream.range(1, 12, 1).map(i => Player(i))
— Просто позвольте компилятору определить тип возвращаемого значения вашего карта. Кроме того, поскольку Игрок является классом case, не используйте new
. Наконец, кейс-классы должны быть final
@AndreyTyukin Дело в том, что при нажатии Ctrl+щелчок по map
IntelliJ переходит к TraversableOnce.scala
, но компилятор не принимает это map
с параметром одного типа.
Пытаться
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))
Метод map
требует два аргумента типа (тип элемента а также — тип возвращаемой коллекции, который может нетривиальным образом зависеть от типа элемента). Оба аргумента обычно опускаются.
Вам не нужно 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]
). Таким образом, аргумент второго типа может использоваться для управления типом возвращаемого значения. Обычно он вам не нужен, и соответствующий тип возвращается автоматически.
Как говорится в сообщении об ошибке: неправильное количество параметров типа. Вы должны написать что-то вроде
.map[Player, Stream[Player]](...)
. Но: 1) Эти типы не нужны. 2) Вам не нужноnew
для создания экземпляров классов case,.map(Player)
будет достаточно. 3) Зачем тебеStream
?