1

我是 scala 的新手,只是创建了一些示例来更好地理解它。我似乎无法在这里解决这个问题——我在我的 java 程序中创建了一个字符串列表并在我的 scala 程序中使用这个列表。我从 java 类中读取列表的 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[?]"

我不使用为什么会发生这种情况。有人可以告诉我我在这里做错了什么吗?

如果代码看起来很脏,我很抱歉,但我是初学者,仍在努力理解这门语言。任何帮助表示赞赏。先感谢您。

4

1 回答 1

1

有很多方法可以做到:

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,按索引,但您必须检查元素是否存在,例如not-null 或其他。

第二种是使用元组,您可以一次分配多个值。如果列表至少有 3 个元素(第一个 case 语句),那么它们将被分配给 (a,b,c) 元组,然后您可以使用 a,b,c... 如果列表的元素少于 3 个,将使用默认值(0,0,0)。

我确信在 Scala 中有更多的方法可以实现这一点。

于 2016-07-07T10:59:22.080 回答