如何在Scala中使用地图更改流的元素类型

时间:2019-04-07 14:04:06

标签: scala stream

我是Scala新手,并且对Stream.map()有疑问。我想要12名球员。为什么我不能这样做:

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

使用map函数的正确方法是什么?
感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

尝试

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 :(得分:1)

  1. 方法map需要两个类型自变量(元素类型返回的集合的类型,这可能以不平凡的方式取决于元素类型)。通常会省略两个参数。

  2. 您不需要new来实例化案例类。实际上,Player伴随对象Player可以用作从IntPlayer的函数。

应用这两个提示可为您提供:

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

但是,对于具有固定数量元素的小型集合使用Stream有点奇怪。 ListVector在这里似乎更合适,因此您甚至可以尝试类似

1 to 12 map Player

如果您想知道map为什么要使用两个类型的参数,下面是几个示例:

// 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)

这将产生具有指定返回类型的值(例如Iterable[Player]而不是Stream[Player])。因此,第二个类型参数可用于控制返回类型。通常,您不需要它,并且会自动返回适当的类型。