【问题标题】:Calculate the differences in a List in a functional way以函数方式计算列表中的差异
【发布时间】:2021-01-28 10:02:46
【问题描述】:

我有一个绝对值列表(例如:10、50、30),我想以函数方式将其转换为这些数字之间差异的列表。因此,如果输入为10, 50, 30,我希望结果为:40, -20

对于上下文:我当前的实现只是一个 for 循环,它跟踪先前的值、计算差异并将其添加到一个新列表中,但我想知道如何以更实用的方式解决这个问题? (我正在使用 Kotlin,但 Java 中的解决方案也可以)

【问题讨论】:

    标签: java kotlin functional-programming


    【解决方案1】:

    使用zipWithNext

    你传入一个带有 2 个参数的 lambda。 zipWithNext 将遍历列表并将每对元素传递给您的 lambda。要计算差异,只需减去:

    val list = listOf(10, 50, 30)
    val result = list.zipWithNext { a, b -> b - a }
    

    【讨论】:

    • 我觉得应该是val result = list.zipWithNext { a, b -> b - a }
    • 啊,拉链,我不知道那个,我正在研究减少/折叠!谢谢,这正是我想要的!
    • @ErikPragt 如果您不知道,zip 通常需要两个(有时更多)集合,并从每个集合中为您提供一个元素,因此这是组合和处理现有事物的好方法有关的。 zipWithNext 是一种特殊情况,它使用相同的集合来为您提供序列中的配对,但一般来说,zip 是一个很好的了解!还有windowed,如果你想在一个集合上滑动窗口,但有两个以上的项目(虽然它不如zipWithNext方便)
    • @cactustictacs 我知道 zip,以为我不知道你可以像 zipWithNext 一样在同一个集合上应用它,但我不知道 windowed,我不确定那将是什么用例。你能举个例子吗?
    • @ErikPragt 是的,你可以这样做 stuff.zip(stuff.drop(1)) { a, b -> whatever },这只是你要压缩在一起的两个迭代器,但 zipWithNext 是一个常见的用例,所以他们已经为你完成了。 windowed 更强大,因为您可以一次处理更多元素,并且还可以控制步骤。所以你可以说,用 ABC、BCD、CDE 等做zipWithNextTwo 的事情(也许计算滚动平均值)或以窗口大小、ABCD、EFGH 等为步长处理块中的集合(有一个简单的函数也称为chunked,但您对此的控制较少)
    猜你喜欢
    • 2011-09-23
    • 2020-07-25
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多