博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Scala片段 1:Folding
阅读量:4950 次
发布时间:2019-06-11

本文共 1597 字,大约阅读时间需要 5 分钟。

原文链接  http://www.ituring.com.cn/article/131425

 

本文翻译自: 

个人能力有限 如翻译不恰当的地方麻烦指正下^_^ fairjm@ituring


Scala为Java开发者提供了很多不错的特性和类库以此来编写更优美和简洁的代码。

但一下子要理解这么多的概念是一件困难的事。在这个由短小的文章组成的系列中,

我将会示范一些scala背后的观点,并且向你展示如何使用它们。

这个系列没有严格的结构,我只是展示一些我找到的有趣的概念。

折叠和反折叠(Folding and unfolding) 在这个片段中,我们将关注folding

来自于wikipedia的folding的定义:

“在函数式编程中,fold - 同样被称为reduce,accumulate,aggregate,compress或者inject -是指一类高阶函数,它们通过递归调用给定的合并操作来处理递归的数据结构并返回最终的结果”

大体上,你输入一些数据,应用一个方法并且返回不同的值。让我们看一下fold的方法签名:

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1

首先看一下: 使用二元合并操作对traversableiterator的元素进行折叠。

对元素操作的执行顺序是不明确的也可能每次操作的执行顺序都不同。

  • A1:二元操作的一个类型参数,是A类型的父类
  • z:对于fold操作来说中立的元素;可能会任意次数增加到结果中,必须确保不影响结果。
    (比如,Nil对于列表链接操作,0对于加法操作,或1对于乘法操作)
  • op:一个二元合并操作
  • 返回:将fold操作op应用在所有元素和z间的结果。

阅读这些描述总让我感到头疼,让我们来看一个例子:

scala> val list = "Hello World this is a string".split(" "); list: Array[String] = Array(Hello, World, this, is, a, string) scala> list.fold(">>") {(z, i) => z + ":" + i } res3: String = >>:Hello:World:this:is:a:string

我们在这里先创建了一个List[String]。我们在这个对象上调用fold方法。我们提供的第一个参数是开始的值,

第二个参数是我们需要应用到这个列表每一个值上的函数。

在这个例子里,我们只是将这些值连接到一起。这个函数的返回值被用于下一次调用的输入值。

让我们来看一下接下来的几个例子:

计算元素的和:

scala> val list = List.range(0, 20) list: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) scala> list.fold(0){(z, i) => z + i } res10: Int = 190

或者元素的积:

scala> val list = List.range(1, 20) list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) scala> list.fold(1){(z, i) => i * z} res12: Int = 109641728

是不是很简单!这里有更多进阶的对于fold的使用例子,

但基本的观念是一样的:

转载于:https://www.cnblogs.com/ihongyan/p/4733299.html

你可能感兴趣的文章
iOS PushMebaby
查看>>
网页消息类
查看>>
【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
查看>>
日常一些出现bug的问题
查看>>
同时启动多个tomcat服务器
查看>>
怎么将iphone上的照片导出到本地文件
查看>>
Repeater+DataPagerSource分页
查看>>
模块化导出
查看>>
pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
查看>>
Sphinx 2.0.8 发布,全文搜索引擎 Installing Sphinx on Windows
查看>>
pod
查看>>
ResultSet 可滚动性和可更新性
查看>>
VS2013 C++代码运行问题
查看>>
iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
查看>>
LUOGU P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
查看>>
toad for oracle中文显示乱码
查看>>
scala的REPL shell的调用
查看>>
SQL中Group By的使用
查看>>
Mybatis映射原理,动态SQL,log4j
查看>>
哪个微信编辑器比较好用?
查看>>