Traversing Mapping Filtering Folding Reducing
2019独角兽企业重金招聘Python工程师标准>>>
Traversing Mapping Filtering Folding Reducing
Traversal
使用 foreach 遍历集合。foreach 是从特质 Iterable 混入而来的。
The signature of foreach is the following:
trait Iterable[+A] {...def foreach(f : (A) => Unit) : Unit = ......
}
foreach 接收一个 函数类型的参数,所以是一个高阶函数。对于map的遍历,A 其实是一个 元组。如下代码示例,
//Traversal
List(1, 2, 3, 4, 5) foreach { i => println("Int: " + i) }// map foreach
val stateCapitals = Map("Alabama" -> "Montgomery","Alaska" -> "Juneau","Wyoming" -> "Cheyenne")stateCapitals foreach { kv => println(kv._1 + ": " + kv._2) }
Mapping
map
集合的map操作会返回和原来集合相同大小的集合。map 作用于集合中的每一个元素。
trait Iterable[+A] {...def map[B] (f : (A) => B) : Iterable[B] = ......
}
下面这个例子把原集合的key-value 中的value的类型给改变了,如下代码,
val stateCapitals = Map("Alabama" -> "Montgomery","Alaska" -> "Juneau","Wyoming" -> "Cheyenne")
val lengths = stateCapitals map { kv => (kv._1, kv._2.length) }
println(lengths) //map操作返回的集合Map(Alabama -> 10, Alaska -> 6, Wyoming -> 8)
flatMap
结合映射[mapping]和扁平化[flattening]
flatMap的函数声明
trait Iterable[+A] {...def map[B] (f : (A) => B) : Iterable[B] = ...def flatMap[B] (f : (A) => Iterable[B] ) : Iterable[B]...
}
首先假设有一个这样的情景:一个list集合,三个元素1,2,3,希望当集合元素是3 的时候,返回3.1,3.2,3.3,如果不是 3,集合元素乘以2。最终返回这样的一个集合,(2,4,3.1,3.2,3.3);
首先看一个map函数的例子,
val list = List(1, 2, 3)
val res = list.map(x => x match {case 3 => List(3.1, 3.2, 3.3)case _ => x * 2
})
println(res) //List(2, 4, List(3.1, 3.2, 3.3))
但结果不是这样的,3.1, 3.2, 3.3 是用一个集合的形式返回的。如果用flatMap会怎么样呢?
val res2 = list.flatMap(x => x match {case 3 => List(3.1, 3.2, 3.3)case _ => List(x * 2)
})println(res2) //List(2, 4, 3.1, 3.2, 3.3)
flatMap是一种常用的组合子,结合映射[mapping]和扁平化[flattening]。 flatMap需要一个处理嵌套列表的函数,然后将结果串连起来。
val nestedNumbers = List(List(1, 2), List(3, 4))val res5 = nestedNumbers.flatMap(x => x.map(_ * 2))println(res5)//List(2, 4, 6, 8)
可以把它看做是“先映射后扁平化”的快捷操作:
val res6 = nestedNumbers.map((x: List[Int]) => x.map(_ * 2)).flattenprintln(res6)//List(2, 4, 6, 8)
这个例子先调用map,然后可以马上调用flatten。
Filtering
filter过滤集合中的元素,
如下代码,过滤map集合中的元素
val stateCapitals = Map("Alabama" -> "Montgomery","Alaska" -> "Juneau","Wyoming" -> "Cheyenne")val map2 = stateCapitals.filter(kv => kv._1 startsWith ("A"))
println(map2)//Map(Alabama -> Montgomery, Alaska -> Juneau)
Reducing
reduce
使用reduce函数,对集合中的两个元素规约,直到最后一个元素,规约的顺序不是一定的。
println(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20).reduce((x: Int, y: Int) => {println(x, y);x + y})) //210
reduceRight 和 reduceLeft 确定了规约的方向,如下,
println(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20).reduceRight((x: Int, y: Int) => {println(x, y);x + y})) //210println(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20).reduceLeft((x: Int, y: Int) => {println(x, y);x + y})) //210
Folding
fold
折叠,容器的折叠。
看如下例子,
val numbers = List(5, 4, 8, 6, 2)
val res90 = numbers.fold(0) { (z, i) => {println(z, i)z + i
}
}println(res90)
运行并输出,
(0,5)
(5,4)
(9,8)
(17,6)
(23,2)
25
最后把这个集合“折叠”成25。
看一下 foldRight 和 foldLeft 的效果,
val res91 = numbers.foldRight(1) { (z, i) => {println(z, i)z + i
}
}val res92 = numbers.foldLeft(1) { (z, i) => {println(z, i)z + i
}
}
println(res91)
println(res92)
也可以这样调用,
val res93 = numbers.foldLeft(1)((z: Int, i: Int) => {println(z, i)z + i
})
运行并输出,foldRight 从右边开始折叠,输入的初始参数为 1 ,从右边开始数,集合第一个元素是 2,相加得到 3,然后又作为下次折叠的入参,和 集合的从右边数的第二个元素相加。同理的 foldLeft。
(2,1)
(6,3)
(8,9)
(4,17)
(5,21)
26
(1,5)
(6,4)
(10,8)
(18,6)
(24,2)
26
还可以参考以下文章:
http://wanghuanming.com/2014/12/Scala-highorder-function/
http://www.ituring.com.cn/article/131442
http://www.iteblog.com/archives/1228
http://www.tuicool.com/articles/Jviyim
==========END==========
转载于:https://my.oschina.net/xinxingegeya/blog/408224
Traversing Mapping Filtering Folding Reducing相关推荐
- 现代编程语言(1):Rust (铁锈,一文掌握钢铁是怎样生锈的)
五种我认为值得掌握的现代编程语言: C(竞品:Zig): Unix/Linux/基础库 等一大波老牌开源基础库和平台开发 JavaScript(升级:TypeScript):浏览器/NodeJS后端/ ...
- 从 RxJS 到 Flink:如何处理数据流?
简介:前端开发的本质是什么?响应式编程相对于 MVVM 或者 Redux 有什么优点?响应式编程的思想是否可以应用到后端开发中?本文以一个新闻网站为例,阐述在前端开发中如何使用响应式编程思想:再以计算 ...
- 转导推理 机器学习_转导-JavaScript中的函数式编程
转导推理 机器学习 One of the great benefits of FP (Functional Programming) is how it encourages a declarativ ...
- Hi-C data analysis tools and papers
Hi-C data analysis tools and papers 全文链接如下: https://github.com/mdozmorov/HiC_tools Tools are sorted ...
- Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例
一.官网说明 A datadistribution configuration is a one-to-many configuration. Oracle GoldenGatesupports sy ...
- python函数编程实战_(转)函数式编程实战教程(Python版)
许多函数式文章讲述的是组合,流水线和高阶函数这样的抽象函数式技术.本文不同,它展示了人们每天编写的命令式,非函数式代码示例,以及将这些示例转换为函数式风格. 文章的第一部分将一些短小的数据转换循环重写 ...
- goldengate for oracle 10g学习
选用的是 a reporting configuration with a data pump on the source system + Loading data with a GoldenGat ...
- GoldenGate 基本参数含义
GoldenGate 基本参数含义 1. edit params命令 2. DBLOGIN USERID <user>, PASSWORD <password> 3. ADD ...
- Oracle goldengate通用配置
一.理论 source ADD EXTRACT <ext>, TRANLOG, BEGIN <time>, [, THREADS] ADD EXTTRAIL <local ...
最新文章
- html5画布显示不出来,运行后html5画布没出来
- 数据结构与算法笔记(十一)—— 归并排序
- 利用键盘钩子捕获Windows键盘动作
- 从零开始学习docker(十四)Docker Compose--build
- 详细记录丨Realtek RTL8188FU WiFi 驱动移植
- ap map 脚本_【图片】fgotool辅助脚本:检测各种素材消耗AP最少的前三个地点【命运冠位指定吧】_百度贴吧...
- kali 开启ssh服务
- 常见问题与常见算法的时间复杂度
- arduino+16路舵机驱动板连接测试
- JS Date.Format
- Windows Server AppFabric分布式缓存详解
- 北斗卫星定位系统原理
- 小程序在政务服务平台建设中如何发挥价值
- 工程造价为什么会出现“三超问题”?
- 人睡眠时做恶梦以及梦魇或鬼压身的原因
- 如何搭建内测托管平台?有可以直接用的内测托管平台吗?
- 2018年北京AQI全年走势图
- Chrome 火焰图
- fedora8 中安装oracle,技术|在 RHEL、CentOS 及 Fedora 上安装 Drupal 8
- 闭环系统的零极点图判定稳定性_系统的稳定性判别
热门文章
- pos机改造迷你打印机_小票打印机如何自动弹出钱箱
- python代码斜率_在Python中准确地测量代码执行时间
- c 语言转换成java语言,求助大神!!!JAVA转换成C语言
- 漫步者蓝牙只有一边有声音_2019年上半年最具“诚意”的真无线劲挂蓝牙耳机新品...
- js 实现ReplaceAll 的方法
- linux让新生成的文件自动加锁,Linux_实用技巧一则 Linux系统对文件进行加锁,当有多个工作线程要同时对一 - phpStudy...
- 12306一直提示网络有问题_教你怎么在12306官网订购火车票 火车票查询12306订购...
- right join
- java进程因机器内存不足被系统kill的定位
- 阿里编码规约扫描eclipse插件安装使用