文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部