文档章节

Scala 规约列表的不同写法

兔之
 兔之
发布于 2016/12/07 16:47
字数 369
阅读 3
收藏 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 可以传入不同的函数实现不同的功能,同时参数也可以自动推导出来。

© 著作权归作者所有

共有 人打赏支持
兔之
粉丝 68
博文 247
码字总数 95896
作品 7
深圳
程序员
私信 提问
Scala 的表达式计算能力

Mathematica 在开发之初就设计成可以深度支持functional programming的。作为一个代数编程系统, Mathematica对于functional programming支持的无疑在同等产品中都是很优秀的,特别是对于模式...

Administra
2013/01/22
1K
1
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
2018/03/08
1
0
应该广泛使用case语句简化函数字面量的实现

这篇文章很短,但足以单独作为一篇文章存在,因为这里介绍的这个Scala编程技巧非常的实用和高效。 在Scala里我们需要大量地编写一些函数字面量作为参数传递给高阶函数,而很多时候,被要求提...

bluishglc
2018/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部