如何在 scala 中使用 flatMap 对一组 "vals" 进行分组
How to use flatMap in scala in order to group a set of "vals"
我是 scala 的新手,只是创建了几个例子来更好地理解它。我在这里似乎无法弄清楚这个问题——我在我的 java 程序中创建了一个字符串列表,并在我的 scala 程序中使用了这个列表。我从 java class 读取列表的 Scala 代码看起来像这样。
private val stringList : Seq[List] = x.getStringName //gets the list from my java program.
stringList 包含
["How", "Are", "You"].
我正在尝试找到一种方法将这些字符串添加到名为 a、b 和 c 的值中,以便稍后可以将它们作为参数传递给另一个函数。
val values = stringList.flatMap{
case x if (!stringList.isEmpty) =>
val a = /*should get the first string How*/
val b = /*should get the second string Are*/
val c = /*should get the third string You*/
case _ => None
}
getCompleteString(a,b,c);
但这不起作用。我给了我一个错误
"type mismatch; found : Unit required: scala.collection.GenTraversableOnce[?]"
我不明白为什么会这样。有人能告诉我我做错了什么吗?
如果代码看起来很脏,我很抱歉,但我是初学者,仍在努力理解这门语言。任何帮助表示赞赏。提前谢谢你。
有很多方法可以做到:
val a = stringList(0)
val b = stringList(1)
val c = stringList(2)
val (a, b, c) = stringList match {
case first :: second :: third :: _ => (first, second, third)
case _ => ("default for a", "default for b", "default for c") // default case..
}
第一种方法是 Java-ish,按索引,但您必须检查元素是否存在,例如非空或其他。
第二个是使用元组,您可以在其中一次分配多个值。如果列表至少有 3 个元素(第一个 case 语句),那么它们将被分配给 (a,b,c) 元组,然后你可以使用 a,b,c... 如果列表少于 3 个元素, 将使用默认值 (0,0,0).
我相信在 Scala 中有更多的方法可以实现这一点。
我是 scala 的新手,只是创建了几个例子来更好地理解它。我在这里似乎无法弄清楚这个问题——我在我的 java 程序中创建了一个字符串列表,并在我的 scala 程序中使用了这个列表。我从 java class 读取列表的 Scala 代码看起来像这样。
private val stringList : Seq[List] = x.getStringName //gets the list from my java program.
stringList 包含
["How", "Are", "You"].
我正在尝试找到一种方法将这些字符串添加到名为 a、b 和 c 的值中,以便稍后可以将它们作为参数传递给另一个函数。
val values = stringList.flatMap{
case x if (!stringList.isEmpty) =>
val a = /*should get the first string How*/
val b = /*should get the second string Are*/
val c = /*should get the third string You*/
case _ => None
}
getCompleteString(a,b,c);
但这不起作用。我给了我一个错误
"type mismatch; found : Unit required: scala.collection.GenTraversableOnce[?]"
我不明白为什么会这样。有人能告诉我我做错了什么吗?
如果代码看起来很脏,我很抱歉,但我是初学者,仍在努力理解这门语言。任何帮助表示赞赏。提前谢谢你。
有很多方法可以做到:
val a = stringList(0)
val b = stringList(1)
val c = stringList(2)
val (a, b, c) = stringList match {
case first :: second :: third :: _ => (first, second, third)
case _ => ("default for a", "default for b", "default for c") // default case..
}
第一种方法是 Java-ish,按索引,但您必须检查元素是否存在,例如非空或其他。
第二个是使用元组,您可以在其中一次分配多个值。如果列表至少有 3 个元素(第一个 case 语句),那么它们将被分配给 (a,b,c) 元组,然后你可以使用 a,b,c... 如果列表少于 3 个元素, 将使用默认值 (0,0,0).
我相信在 Scala 中有更多的方法可以实现这一点。