2016-02-18 78 views
2

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

的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) 
+3

请注意,如果任何字符串为空,则调用'head'是不安全的。在这种情况下,你应该使用'flatMap(_。headOption)'来忽略它们。 –

+0

接受,因为你让我明白我要去哪里错了。尽管对其他(稍微)更快的答案也很感谢。 –

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

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

+0

'斯卡拉>设置( “富”,“酒吧“,”“).map(s => s.head) java.util.NoSuchElementException:next迭代器空值 –

2

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

mySetOfStrings.flatMap(_.headOption) 
1

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

mySetOfStrings.flatMap(_.take(1)) 
相关问题