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

时间:2016-02-18 15:24:55

标签: scala set map-function

我想用一组字符串中的第一个字符创建一个集合。似乎我应该能够轻松映射,但我无法弄清楚正确的语法或在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"

感谢。

4 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

如果要忽略输入中的空字符串,则可以使用:

mySetOfStrings.flatMap(_.headOption)

答案 3 :(得分:1)

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

mySetOfStrings.flatMap(_.take(1))