文档章节

Scala 规约列表的不同写法

兔之
 兔之
发布于 2016/12/07 16:47
字数 369
阅读 1
收藏 0

Scala 规约列表(Reducing)的意思是将列表转换为单个值。

自带版本

如使用 List 自带的操作符号

    List(41, 234, 23).max                         //> res3: Int = 234
    List(11.3, 23).sum                            //> res4: Double = 34.3

自定义版本

也可以自己实现这种规约操作函数

    def contains(x: Int, l: List[Int]): Boolean = {
        var a: Boolean = false
        for (i <- l) { if (!a) a = (i == x) }
        a
    }                                             //> contains: (x: Int, l: List[Int])Boolean
    contains(3, List(1, 3, 5, 7))                 //> res5: Boolean = true

函数参数版本

但对 List 的操作只能是判断是否含有某个函数,如果想进行多个操作,就可以自己传入函数定义

    def boolReduce(l: List[Int], start: Boolean)(f: (Boolean, Int) => Boolean): Boolean = {
        var a = start
        for (i <- l) a = f(a, i)
        a
    }      //> boolReduce: (l: List[Int], start: Boolean)(f: (Boolean, Int) 
                                                  //=> Boolean)Boo
                                                  //| lean
    boolReduce(List(1, 3, 5, 19), false)({(a, i) => if (a) a else (i == 19)})
                                                  //> res6: Boolean = true

泛型版本

这样可以传入自己定义的函数,进一步的可以将参数泛型化

    def reduceOp[A, B](l: List[A], start: B)(f: (B, A) => B): B = {
        var a =start
        for (i <- l) a = f(a, i)
        a
    }                   //> reduceOp: [A, B](l: List[A], start: B)(f: (B, A) => B)B
    reduceOp(List(1, 3, 5, 19), false)({(a, i) =>if (a) a else (i == 19)})
                                                  //> res7: Boolean = true
    reduceOp(List(1.2, 3.3, 2.3), 0.0)({(a, i) => a + i})
                                                  //> res8: Double = 6.8
    reduceOp(List(1.2, 3.3, 2.3), 0.0)(_ + _)     //> res9: Double = 6.8

等价于 Scala 自带方法

List(1.2, 3.3, 2.3).fold(0.0)(_ + _)          //> res10: Double = 6.8

reduceOp 可以传入不同的函数实现不同的功能,同时参数也可以自动推导出来。

© 著作权归作者所有

共有 人打赏支持
兔之
粉丝 66
博文 247
码字总数 95896
作品 7
深圳
程序员
Traversing Mapping Filtering Folding Reducing

Traversing Mapping Filtering Folding Reducing Traversal 使用 foreach 遍历集合。foreach 是从特质 Iterable 混入而来的。 The signature of foreach is the following: trait Iterabl......

秋风醉了
2015/04/29
0
0
使用函数字面量的简写形式时需要注意的问题

给定一个整数列表intList,要求打印每个元素值,并对每个元素值加一. 你可能会写出这样的代码: (1 to 10) map { println(x); _ + 1 } 但你不会得到预期的结果,除非: (1 to 10) map { x =>...

mj4738
2012/02/05
0
0
Scala Sequence List

Scala里面的List太操蛋了。 各种操作符,简直人类真是难以记得啊。 1、不可变List 1.1、 新建一个不可变List 1.2、 要想往里面新加一个元素0,怎么办?注意到:list7是不可变的,往里面加一个...

Germmy
03/08
1
0
写给Python程序员的Scala入门教程

随着业务和数据的需要,我们引入了。对的支持还是挺好的,但毕竟它还是使用开发的,且现有的API并没有100%覆盖Python。所以就有了这篇文章,让Python程序员可以接触这门更高(级)、更快(速...

羊八井
2015/11/29
906
2
Scala基础语法

Scala 是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃 Java 这个强大的平台,它运行在 Java 虚拟机 (Java Virtual Machine) 之上,轻松实现和丰富的 Java 类库...

岁月留痕
2015/12/08
35
0

没有更多内容

加载失败,请刷新页面

加载更多

同样是工作3年程序员,为什么别人每月25K你却只有15K?

你有没有静下心来思考过:同样是做了x年Java开发,为什么你的技术比别人差很多?为什么别人每月26K你却只有15K? 其实技术水平的高低和个人智商关系不大(毕竟能做Java编程开发大家都不会差)...

Java填坑之路
27分钟前
3
0
跨域问题:解决跨域的三种方案

当前端页面与后台运行在不同的服务器时,就必定会出现跨域这一问题,本篇简单介绍解决跨域的三种方案,部分代码截图如下,仅供参考: 方式一:使用ajax的jsonp 前端代码 服务器代码 使用该方...

rechardchensir
27分钟前
4
0
linux学习-1012

8.6 管道符和作业控制 8.7/8.8 shell变量 8.9 环境变量配置文件 扩展 bashrc和bash_profile的区别 http://ask.apelearn.com/question/7719 简易审计系统: http://www.68idc.cn/help/server/...

wxy丶
28分钟前
1
0
springboot dubbo 在程序初始化完成前 使用回声测试对服务依赖检测

<dubbo:consumer timeout="10000" check="false" /><dubbo:service delay="-1" /> @Component@Order(2)public class PrkServiceInit implements ApplicationListener {private Logge......

林伟琨
30分钟前
3
0
“网红架构师”解决你的Ceph 运维难题

Q1. 环境预准备 绝大多数MON创建的失败都是由于防火墙没有关导致的,亦或是SeLinux没关闭导致的。一定一定一定要关闭每个每个每个节点的防火墙(执行一次就好,没安装报错就忽视): CentOS s...

编程SHA
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部