Scala学习(四)——模式匹配与函数组合
函数组合
让我们创建两个函数:
def f(s: String) = "f(" + s + ")"
def g(s: String) = "g(" + s + ")"
compose
compose 组合其他函数形成一个新的函数 f(g(x))
val fComposeG = f _ compose g _
fComposeG("yay") // f(g(yay))
andThen
andThen 和 compose很像,但是调用顺序是先调用第一个函数,然后调用第二个,即g(f(x))
val fAndThenG = f _ andThen g _
fAndThenG("yay") // g(f(yay))
柯里化 vs 偏应用
case 语句
那么究竟什么是case语句?
这是一个名为PartialFunction的函数的子类。
多个case语句的集合是什么?
他们是共同组合在一起的多个PartialFunction。
理解PartialFunction(偏函数)
对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收任意Int值,并返回一个字符串。
对给定的输入参数类型,偏函数只能接受该类型的某些特定的值。一个定义为(Int) => String 的偏函数可能不能接受所有Int值为输入。
isDefinedAt 是PartialFunction的一个方法,用来确定PartialFunction是否能接受一个给定的参数。
注意 偏函数PartialFunction 和我们前面提到的部分应用函数是无关的。
val one: PartialFunction[Int, String] = { case 1 => "one" }
one.isDefinedAt(1) // true
one.isDefinedAt(2) // false
您可以调用一个偏函数。
one(1) // one
PartialFunctions可以使用orElse组成新的函数,得到的PartialFunction反映了是否对给定参数进行了定义。
val two: PartialFunction[Int, String] = { case 2 => "two" }
val three: PartialFunction[Int, String] = { case 3 => "three" }
val wildcard: PartialFunction[Int, String] = { case _ => "something else" }
val partial = one orElse two orElse three orElse wildcard
partial(5) // something else
partial(3) // three
partial(2) // two
partial(1) // one
partial(0) // something else
case 之谜
上周我们看到一些新奇的东西。我们在通常应该使用函数的地方看到了一个case语句。
case class PhoneExt(name: String, ext: Int) defined class PhoneExt
val extensions = List(PhoneExt("steve", 100), PhoneExt("robey", 200))
extensions.filter { case PhoneExt(name, extension) => extension < 200 } // List(PhoneExt(steve,100))
为什么这段代码可以工作?
filter使用一个函数。在这个例子中是一个谓词函数(PhoneExt) => Boolean。
PartialFunction是Function的子类型,所以filter也可以使用PartialFunction!
Scala学习(四)——模式匹配与函数组合的更多相关文章
- Scala学习(四)---映射和元组
映射和元组 摘要: 一个经典的程序员名言是:"如果只能有一种数据结构,那就用哈希表吧".哈希表或者更笼统地说映射,是最灵活多变的数据结构之一.映射是键/值对偶的集合.Scala有一个通用的叫法:元组, ...
- Scala学习(二)--- 控制结构和函数
控制结构和函数 摘要: 本篇主要学习在Scala中使用条件表达式.循环和函数,你会看到Scala和其他编程语言之间一个根本性的差异.在Java或C++中,我们把表达式(比如3+4)和语句(比如if语句 ...
- Scala学习四——映射和数组
一.本章要点 Scala有十分易用的语言来创建,查询和遍历映射 你需要从可变和不可变的映射中做出选择 默认情况下,你得到的是一个哈希映射,不过你也可以指明要树形映射 你可以很容易地在Scala映射和J ...
- Scala学习二——控制结构和函数
一.if表达式有值 val s=if(x>0) 1 else -1,相当于Java中x>0?1:-1(不过不拿呢个在?:中插入语句),而且Scala中可以用混合类型(如if (x>0 ...
- scala学习笔记(7):函数(1)
函数是Scala的第一公民! 1 基本定义 scala> def max(x: Int, y: Int): Int = { if (x > y) x else y } 跟着是括号里带有冒 ...
- scala学习笔记:理解函数
定义一个函数: scala> def foo(x:Int)=x*2 foo: (x: Int)Int 可以采用匿名参数: scala> def foo:((Int)=>Int) = ...
- Scala学习(四)练习
映射和元组&练习 1. 设置一个映射,其中包含你想要的一些装备,以及它们的价格.然后构建另一个映射,采用同一组键,但在价格上打9折 映射代码如下: object HelloScala{ def ...
- scala学习笔记4:函数和闭包
以下主要记录的是看完scala in programming这本书functions and closures(第八章)后的要点总结. 1,函数可以存在的地方:函数方法,嵌套函数. 2,关于funct ...
- scala 学习笔记--模式匹配
1.switch java代码 switch (cause) { case ‘2‘ : dropTime=time; case ‘8’:case ‘9’ : case ‘10’:case ‘11’ : ...
随机推荐
- vue开大主要难点解决方式
问题:在我们那vue开发项目时,多层嵌套组件最繁琐,组件传参成最难的问题,并且对兄弟组件传参也无能为力,也会导致代码很难维护. 解决:采用vuex状态管理,把所有的事件和状态都储存在store对象中, ...
- Vue+axios 拦截,超时登录问题
axios.interceptors.request.use(config => config, error => Promise.reject(error)); axios.interc ...
- 创建全文索引----SQLserver
1.启动 Microsoft Search 服务 开始菜单-->SQL程序组-->服务管理器-->下拉筐-->Microsoft Search 服务-->启动它. 2. ...
- HTTP/HTTPS协议 & GraphQL(非RESTFUL方式)
HTTP访问控制-跨域资源共享(CORS) 缓存管理 HTTP VS HTTPS架构 TLS协议 HTTPS会话劫持 基于HTTP协议的服务器消息机制 1. Longpoll 2. SSE 3. We ...
- Spring Boot 实际操作
1.什么是springboot 2.springboot的很多默认编码方式都是utf-8,真是福利啊. 3.spring boot如何启动和访问和MocMvc测试 4.开发环境的调试热启动 5.app ...
- centos7网络配置脚本
如下参数根据实际情况修改 #!/bin/bash #设置网络环境 sed -i -e 's|BOOTPROTO=dhcp|BOOTPROTO=static|' /etc/sysconfig/netwo ...
- 4.flask第三方组件
1.flask-session的使用 在flask中,有一个app.session_interface = SecureCookieSessionInterface(),也就是存session,调用o ...
- jQuery获取兄弟标签的文本
// 一个div里面有一个span标签和多个button标签,每个button标签都有id,span标签没有id,通过点击其中一个button标签,来获取到span标签的text function ( ...
- android studio 下载sdk
一.打开android studio 的"setting",搜索 "proxy",选中"No Proxy"
- python出现Non-ASCII character '\xe6' in file statistics.py on line 19, but no encoding declared错误
可按照错误建议网址查看http://www.python.org/peps/pep-0263.html 发现是因为Python在默认状态下不支持源文件中的编码所致.解决方案有如下三种: 一.在文件头部 ...