加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么使用foldLeft而不是程序版?

发布时间:2020-12-16 08:51:00 所属栏目:安全 来源:网络整理
导读:因此,在阅读 this question时,有人指出,而不是程序代码: def expand(exp: String,replacements: Traversable[(String,String)]): String = { var result = exp for ((oldS,newS) - replacements) result = result.replace(oldS,newS) result} 您可以编写以
因此,在阅读 this question时,有人指出,而不是程序代码:

def expand(exp: String,replacements: Traversable[(String,String)]): String = {
  var result = exp
  for ((oldS,newS) <- replacements)
    result = result.replace(oldS,newS)
  result
}

您可以编写以下功能代码:

def expand(exp: String,String)]): String = {
  replacements.foldLeft(exp){
    case (result,(oldS,newS)) => result.replace(oldS,newS)
  }
}

我几乎肯定会编写第一个版本,因为熟悉程序或函数样式的编码人员可以轻松阅读和理解它,而只有熟悉函数风格的编码人员才能轻松阅读和理解第二个版本.

但暂时将可读性放在一边,有没有什么能让foldLeft成为比程序版本更好的选择?我可能认为它会更有效率,但事实证明implementation of foldLeft实际上只是上面的程序代码.那么它只是一种风格选择,还是有充分的理由使用一个版本或另一个版本?

编辑:为了清楚,我不是在询问其他功能,只是foldLeft.我对使用foreach,map,filter等非常满意,这些都可以很好地映射到for-comprehension.

答:这里有两个很好的答案(由delnan和Dave Griffith提供),即使我只能接受一个:

>使用foldLeft,因为还有其他优化,例如使用while循环,它比for循环更快.
>如果它被添加到常规集合中,则使用fold,因为这将使向并行集合的转换变得微不足道.

解决方法

它更短更清晰 – 是的,您需要知道什么是折叠才能理解它,但是当您使用50%功能的语言进行编程时,您应该知道这些基本构建块.折叠正是程序代码所做的(重复应用操作),但它给出了一个名称并进行了概括.虽然它只是一个小轮子你正在重新发明,但它仍然是一个轮子改造.

如果foldLeft的实现应该获得一些特殊的好处 – 比如说,额外的优化 – 你可以免费获得它,而无需更新无数的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读