如何在 Scala 中从一组 String 生成一组 Char

How to produce a set of Char from a set of String in Scala

我想用一组字符串中的第一个字符创建一个集合。似乎我应该能够轻松映射,但我无法找出正确的语法或在 SO 或网络的其余部分找到它。这是我所在的位置:

val mySetOfStrings = scala.collection.immutable.Set[String]()
def charSet: Set[Char] = mySetOfStrings.map[Char]((s: String) => s.head)

//IDE tells me "Expression of type Char doesn't conform to expected type B"

谢谢。

scala> Set("foo", "bar", "baz").map( s => s.head )
res0: scala.collection.immutable.Set[Char] = Set(f, b)

您通常不会自己为 map 方法提供类型参数。

如果你想忽略输入中的空字符串,那么你可以使用:

mySetOfStrings.flatMap(_.headOption)

IDE 错误不正确,但手动向 map 提供类型参数会给您带来问题,因为 map 的签名实际上是:

final def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]): That

所以实际的编译器错误是:

<console>:12: error: wrong number of type parameters for method map: [B, That](f: String => B)(implicit bf: scala.collection.generic.CanBuildFrom[scala.collection.immutable.Set[String],B,That])That
       strings.map[Char](_.head)
                  ^

请注意,类型参数有两种,而不是一种。不过,编译器会自行推断 Char

scala> val strings = Set("abc", "def", "ijk")

scala> strings.map(_.head)
res1: scala.collection.immutable.Set[Char] = Set(a, d, i)

手动提供类型参数必须如下所示:

scala> strings.map[Char, Set[Char]](_.head)
res6: Set[Char] = Set(a, d, i)

另一种绕过空字符串的方法,

mySetOfStrings.flatMap(_.take(1))