【问题标题】:How to use flatMap in scala in order to group a set of "vals"如何在 Scala 中使用 flatMap 来对一组“vals”进行分组
【发布时间】:2016-11-09 15:58:19
【问题描述】:

我是 scala 的新手,只是创建了一些示例以更好地理解它。我似乎无法在这里解决这个问题——我在我的 java 程序中创建了一个字符串列表并在我的 scala 程序中使用这个列表。我从 java 类中读取列表的 scala 代码看起来像这样。

  private val stringList : Seq[List] = x.getStringName //gets the list from my java program. 

字符串列表包含

   ["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[?]"

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

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

【问题讨论】:

  • 您确定您的stringList 具有Seq[List] 类型吗?不应该是List[String]Seq[String] 还是什么?您可以删除该类型并查看您的 IDE 告诉您有关该类型的内容。

标签: java list scala flatmap


【解决方案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,按索引,但您必须检查元素是否存在,例如非空或其他。

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

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

【讨论】:

  • 嘿@insan-e 谢谢你。如果我使用对象列表而不是使用字符串,那么我该如何做同样的事情呢?您能否也就此提出一些建议?
  • 对于任何类型的 List 都应该相同,因为它是通用的 List[T]。 :)
  • 所有 case 语句的返回类型必须相同,以便将其分配给 tuple3,例如。
猜你喜欢
  • 2016-04-04
  • 2014-12-18
  • 2022-09-26
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 2015-10-06
相关资源
最近更新 更多