gpt4 book ai didi

scala - 什么是 : "operation of a program should map input values to output values rather than change data in place" 的好例子

转载 作者:行者123 更新时间:2023-12-04 09:54:19 26 4
gpt4 key购买 nike

我在 Scala 中在解释它的 时遇到了这句话。功能行为 .

operation of a program should map input of values to output values rather than change data in place



有人可以用一个很好的例子来解释它吗?

编辑:请在上下文中解释或举例说明上述句子,请不要将其复杂化以引起更多混淆

最佳答案

这所指的最明显的模式是与 Scala 相比,在 Java 中编写使用集合的代码的方式之间的差异。如果您正在编写 Scala,但使用 Java 的习惯用法,那么您将通过在适当的位置改变数据来处理集合。执行相同操作的惯用 Scala 代码将有利于将输入值映射到输出值。

让我们来看看您可能想要对集合执行的一些操作:

过滤

在 Java 中,如果我有 List<Trade>我只对与德意志银行执行的交易感兴趣,我可能会这样做:

for (Iterator<Trade> it = trades.iterator(); it.hasNext();) {
Trade t = it.next();
if (t.getCounterparty() != DEUTSCHE_BANK) it.remove(); // MUTATION
}

在这个循环之后,我的 trades集合仅包含相关交易。但是,我使用突变实现了这一点 - 粗心的程序员很容易错过 trades是一个输入参数、一个实例变量,或者在方法的其他地方使用。因此,它是 很可能他们的代码现在已损坏 .此外,出于同样的原因,这样的代码对于重构来说非常脆弱;希望重构一段代码的程序员必须非常小心,不要让变异的集合脱离它们打算使用的范围,反之亦然,他们不会意外地在应该使用的地方使用未变异的集合使用了一个突变的。

与 Scala 比较:
val db = trades filter (_.counterparty == DeutscheBank) //MAPPING INPUT TO OUTPUT

这将创建一个新集合!它不会影响任何正在查看 trades 的人并且本质上更安全。

映射

假设我有一个 List<Trade>我想得到一个 Set<Stock>对于我一直在交易的独特股票。同样,Java 中的习惯用法是创建一个集合并对其进行变异。
Set<Stock> stocks = new HashSet<Stock>();
for (Trade t : trades) stocks.add(t.getStock()); //MUTATION

使用 scala 正确的做法是映射输入集合,然后转换为集合:
val stocks = (trades map (_.stock)).toSet  //MAPPING INPUT TO OUTPUT

或者,如果我们关心性能:
(trades.view map (_.stock)).toSet
(trades.iterator map (_.stock)).toSet

这里有什么优势?好:
  • 我的代码永远无法观察到部分构造的结果
  • 一个函数的应用A => BColl[A]获得 Coll[B]更清楚。

  • 积累

    同样,在 Java 中,习惯用法必须是突变。假设我们试图对我们完成的交易的十进制数量求和:
    BigDecimal sum = BigDecimal.ZERO
    for (Trade t : trades) {
    sum.add(t.getQuantity()); //MUTATION
    }

    同样,我们必须非常小心,不要意外观察到部分构造的结果!在 Scala 中,我们可以在一个表达式中做到这一点:
    val sum = (0 /: trades)(_ + _.quantity) //MAPPING INTO TO OUTPUT

    或其他各种形式:
    (trades.foldLeft(0)(_ + _.quantity)
    (trades.iterator map (_.quantity)).sum
    (trades.view map (_.quantity)).sum

    哦,对了, Java 实现中有一个错误! 你发现了吗?

    关于scala - 什么是 : "operation of a program should map input values to output values rather than change data in place" 的好例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777529/

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