list - Scala flatMap,什么是ms和e?

标签 list scala

我正在学习 Scala,在下面的代码中使用 flatMap(取自 99 Scala 问题)我有

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
    case ms: List[_] => flatten(ms)
    case e => List(e)
}

现在我完全混淆了“ms”和“e”是什么?它们一定是关键,好像我将 ms 更改为 dd,我收到错误“未找到值 ms”。如果我将鼠标悬停在它们上面,我会得到一个工具提示,上面写着“ms”是一个“List[][]”,而“e”是“Any”。

我试过在谷歌上搜索“Scala List elements ms and e”或“Scala flatMap ms and e”或“Scala case ms 和 case e 是什么意思?”但我似乎没有找到任何可以解释这些“ms”和“e”是什么的东西。

它们是关键字吗?我在哪里可以在 Scala 文档中找到有关它们的信息?

附言我理解代码,但不知道 ms 和 e 是什么

最佳答案

如果你是新手,让我一步一步解释这里发生了什么。

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
    case ms: List[_] => flatten(ms)
    case e => List(e)
}

写得很详细:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something =>
    something match {
      case ms: List[_] => flatten(ms)
      case e => List(e) 
    }
}

什么是mse ?

首先让我分解一下。

您正在对 List[Any] 进行平面映射.
val x = List("Str1", "Str2", "Str3")
val y = x flatMap { elementInList => List(elementInList) }

这意味着对于列表中的每个元素,您正在创建一个包含该元素的新列表。因为它是 flatMap你基本上得到了相同的(相同的元素)列表。

查看如果您使用 map 会发生什么情况而不是 flatMap :
val x = List("Str1", "Str2", "Str3")
val y = x map { elementInList => List(elementInList) }
val y将是:
List(List("Str1"), List("Str2"), List("Str3"))

退房 http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

现在,看看冗长的例子:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something =>
    something match {
      case ms: List[_] => flatten(ms)
      case e => List(e) 
    }
}

您正在匹配列表中的元素,或者在这种情况下称为 something .
你也在匹配元素 type .

例如
def myMatch(e: Any): String = {
  e match {
    case x: String  => "Its a String: " + x
    case y: Int     => "Its a Int: " + y
    //notice how im using x twice.. its because they're in separate scope!
    case x: Boolean => "Its a Boolean: " + x
    case _          => "Its something else!"
  }
}

调用 myMatch与参数 "hello"它将返回 "Its a String: hello" .

调用 myMatch与参数 1它将返回 "Its a Int: 1" .

退房 http://docs.scala-lang.org/tutorials/tour/pattern-matching.html

什么是ems ?

让我们看看你的代码:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
    case ms: List[_] => flatten(ms)
    case e => List(e)
}

如果我们当前查看的列表中的元素是类型 List[_] (与 List[Any] 相同),然后我们执行这个块, flatten(ms) .msval一旦匹配就分配给元素。

如果我们当前查看的列表中的元素是类型 _或者基本上默认( case _ => )然后返回一个 List(e)包含一个元素,即我们正在查看的元素。

这将始终返回 List[List[Any]] .然后将其展平为 List[Any] .

我希望这有帮助,

里斯

关于list - Scala flatMap,什么是ms和e?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37340912/

相关文章:

list - 如何将我的数据保存在列表中,以便在Flutter应用程序的整个生命周期中都可以使用?

java - rocksdb 的 Flink 增量检查点使用大量内存

algorithm - 乘以集合并随机与其他集合合并 - Apache Spark

r - append 到具有动态名称的列表

c# - List<long> 在 C# 中以逗号分隔的字符串

python - 可以在 Python 中创建非常大的元组吗?

postgresql - 如何在 slick + postgresql 上进行分页选择

python - 强制列表中的数字保留两位小数

scala - 消除与父类(super class)的类字段同名的构造函数参数的歧义

mongodb - 带有 reactivemongo 进程的 embedmongo 不退出