gpt4 book ai didi

Scala:如何将 Fold* 与 Map 一起使用?

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

我有一个 Map[String, String] 并希望将这些值连接到单个字符串。

我可以看到如何使用列表来做到这一点...

scala> val l = List("te", "st", "ing", "123")
l: List[java.lang.String] = List(te, st, ing, 123)

scala> l.reduceLeft[String](_+_)
res8: String = testing123

fold* 或 reduce* 似乎是正确的方法,我只是无法获得适合 Map 的语法。

最佳答案

map 上的折叠与成对列表上的折叠工作方式相同。您不能使用reduce,因为结果类型必须与元素类型相同(即一对),但您需要一个字符串。因此,您使用 foldLeft 并将空字符串作为中性元素。您也不能只使用 _+_ 因为这样您会尝试将一对添加到字符串中。您必须改用一个函数,将累积的字符串、该对的第一个值和该对的第二个值相加。所以你得到这个:

scala> val m = Map("la" -> "la", "foo" -> "bar")                 
m: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(la -> la, foo -> bar)

scala> m.foldLeft("")( (acc, kv) => acc + kv._1 + kv._2)
res14: java.lang.String = lalafoobar

折叠第一个参数的解释:

如您所知,函数 (acc, kv) => acc + kv._1 + kv._2 有两个参数:第二个是当前正在处理的键值对。第一个是迄今为止积累的结果。但是,当处理第一对时(并且尚未累积结果),acc 的值是多少?当您使用reduce时,acc的第一个值将是列表中的第一对(kv的第一个值将是列表中的第二对)。但是,如果您希望结果的类型与元素类型不同,则这不起作用。因此,我们不使用reduce,而是使用fold,将acc的第一个值作为foldLeft的第一个参数传递。

简而言之:foldLeft 的第一个参数表示 acc 的起始值应该是什么。

正如 Tom 指出的,您应该记住,映射不一定保持插入顺序(Map2 和 co. 会这样做,但 hashmap 不会),因此字符串可能以与中不同的顺序列出元素。您插入了它们。

关于Scala:如何将 Fold* 与 Map 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3199414/

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