【问题标题】:Developing lambda expression开发 lambda 表达式
【发布时间】:2017-11-28 18:02:47
【问题描述】:
var t = 0
fun sumIntMap(hm: HashMap<Int,Int>) = hm.forEach{ x -> t+=x.value 
}.let { t }

尝试将 Hashmap Int 值与函数相加,我似乎无法对其进行优化,因此它不需要捕获和需要 temp var (t)。

如何在 lambdas 中使用临时变量并返回它们?是我写它的唯一真实方式(使用 let 返回 temp var)吗?

谢谢!

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    您可以将您的 HashMap 条目映射到它们的值以获取 Ints 列表,然后对该列表中的值求和:

    hm.map { it.value }.sum()
    

    如果您有List 而不是Map,您也可以使用fold 或reduce 对您的原始代码执行类似的操作:

    hm.toList().fold(0, { acc, pair -> acc + pair.second })
    

    【讨论】:

    • 您好,真的,我正在研究当 lambda 使用 let 处理多个变量(在本例中为 x & t)时从 lambda 返回特定值的一般概念允许我这样做,但可以它可以在 lambda 本身内完成而无需链接?
    • @HiLo,我不能 100% 确定你在问什么,但也许你正在寻找 reduce,这实际上是一个更通用的 sum。
    • 您要么必须链接调用,要么使用fold 或reduce 之类的运算符——尽管这些仅在List 上可用,而不是Map。我已经使用fold 的解决方案编辑了我的答案,它看起来更像您的代码,该运算符可能就是您正在寻找的。​​span>
    • 我相信你甚至可以将pair 解构为(_, value),也许这符合Kotlin 的功能特性:)
    • @HiLo 你所说的概念是fold。阅读@zsmb13 答案的第二部分,他是对的。 0 取代了您的 t = 0,而 acc 实际上是您的 t。另请注意,您只需执行“hm.values”即可获取值:hm.values.fold(0) { t, v -&gt; t + v}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2023-03-12
    • 1970-01-01
    • 2014-04-08
    • 2013-09-30
    • 2010-11-12
    • 2019-07-29
    相关资源
    最近更新 更多