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