gpt4 book ai didi

scala - 为什么 Scala map 上的 .map.flatten 和 flatMap 会返回不同的结果?

转载 作者:行者123 更新时间:2023-12-02 06:27:26 26 4
gpt4 key购买 nike

我听很多人说flatMap 类似于map + flatten。例如,the answer .

Quite a difference, right?
Because flatMap treats a String as a sequence of Char, it flattens the resulting list of strings into a sequence of characters (Seq[Char]).
flatMap is a combination of map and flatten, so it first runs map on the sequence, then runs flatten giving the result shown.

但是我今天遇到了一些代码问题。 mapflatMap 的结果似乎不同。这是我的代码

object ListDemo {
def main(args: Array[String]): Unit = {
val map1 = Map("a" -> List(1 ->11,1->111), "b" -> List(2 -> 22, 2 ->222)).map(_._2).flatten
val map2 = Map("a" -> List(1 ->11,1->111), "b" -> List(2 -> 22, 2 ->222)).flatMap(_._2)
map1.foreach(println)
println()
map2.foreach(println)
}
}

结果出乎意料。

(1,11)
(1,111)
(2,22)
(2,222)

(1,111)
(2,222)

为什么会这样?

最佳答案

当使用返回 (K, V)fMap 上调用 .map(f) 时> 对于某些 K 和 V(不一定是原始 Map 的相同 K 和 V 类型),结果将是 Map[K, V]。否则,如果 f 返回一些其他(非对)类型 T,结果将是一个 Iterable[T]。因此,如果函数返回一对,它将是一个 Map,否则将是一个 Iterable

在你的例子中,函数返回 List[(Int, Int)],所以结果是 Iterable[List[(Int, Int)]] - 不是一张 map 。 .flatten 然后将其转换为 Iterable[(Int, Int)]

当直接使用 flatMap 时,您直接以 (Int, Int) 对结束,因此结果将是 Map[Int, Int] - 不是 Iterable[(Int, Int)]。由于 Map 不允许重复键,因此 Map 包含的元素少于 Iterable

关于scala - 为什么 Scala map 上的 .map.flatten 和 flatMap 会返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54230733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com