scala 学习笔记(07) 一等公民的函数
时间:2022-04-22
本文章向大家介绍scala 学习笔记(07) 一等公民的函数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在scala中一切皆对象,一切皆函数,函数跟Int,String、Class等其它类型是处于同等的地位,换句话说,使用函数跟使用普通的类型一样,没什么区别,因此:
1、函数可以赋值给变量,可以当参数传递
def helloWorld(msg: String): Unit = {
println("Hello," + msg)
}
def foo = {
println("foo")
}
def main(args: Array[String]) {
//函数赋值给变量
var d = helloWorld _
d("jimmy") //Hello,jimmy
//直接定义匿名函数
d = (msg: String) => println("你好," + msg)
d("杨俊明") //你好,杨俊明
//无参函数,作为另一个函数的参数
var x = (a: Unit, b: String) => {
a
println(b)
}
x(foo,"ha ha")
//foo
//haha
}
上面这些代码都是合法的
2、函数可以嵌套
既然class里可以定义class,函数是一等公民,理应享受跟class同样的待遇,因此当然也可以嵌套
def funA(arr: Array[String]) = {
def funB(a: String) = {
'[' + a.trim + ']'
}
arr.foreach(x => println(funB(x)))
}
def main(args: Array[String]) {
funA(Array("a", " b ", "c ", " f"))
// [a]
// [b]
// [c]
// [f]
}
3、所谓的偏函数
def add(a: Int, b: Int, c: Int) = {
a + b + c
}
def main(args: Array[String]) {
val add2 = add(_: Int, _: Int, 0)
println(add2(1, 2)) //3
}
利用这个技巧,可以实现带缺省参数,参数个数不同的"重载"版本
4、闭包
def fun = {
var i = 10;
def funTest = {
println(i)
i = i + 1
}
funTest
println(i)
}
def main(args: Array[String]) {
fun
}
funTest访问了funTest定义范围之外的变量 i
5、高阶函数
def main(args: Array[String]) {
(1 to(9, 2)).map("*" *).foreach(x => println(" " * ((9 - x.length) / 2) + x))
// *
// ***
// *****
// *******
// *********
}
打印一颗小树冠,代码如此简单? 算法逻辑见下图,这不是重点,重点是上面这行代码是函数叠函数,to是对象1的一个函数,1 to (9,2),即从1到9,每次递增2,最终即为1,3,5,7,9,然后用map函数映射成一行行星号,然后再用foreach函数,结合前置空格输出
// move len// 4 * 1// 3 *** 3// 2 ***** 5// 1 ******* 7// 0********* 9
6、克里化(curring)
def add_1(a: Int, b: Int, c: Int) = {
a + b + c
}
def add_2(a: Int) = (b: Int, c: Int) => {
a + b + c
}
def add_3(a: Int) = (b: Int) => (c: Int) => {
a + b + c
}
def main(args: Array[String]) {
println(add_1(1, 2, 3)) //6
println(add_2(1)(2, 3)) //6
println(add_3(1)(2)(3)) //6
}
这个一直没明白真正的用途,号称是可以用来做参数的类型智能推断,但我感觉只是可以把参数拆散,在参数的调用方式上,略有『链式』编程的风格
7、参数隐式转换
def add(a: Int, b: Int) = a + b
def foo(a:Int)={
println(a)
}
def boo(a:String)={
println(a)
}
implicit def convert(x: String): Int = {
x match {
case "one" => 1
case "two" => 2
case "three" => 3
case _ => 0
}
}
def main(args: Array[String]) {
println(add("one", "two"))//3
foo("one")//1
boo("one")//one
}
我们并没有定义一个形如add(a:String,b:String)的加法函数,但是最终即成功调用了add("one","two"),秘密在于implicit做了参数的隐式转换,这一个很强大的武器,威力过于巨大,上面的这个转换,会把当前代码作用域的所有String参数,默认都按这个规则转换,foo("one")输出1就是证明,所以没掌握精通前,建议小心使用。
- 浅述RDF,畅想一下FOAF应用
- 数据源控件参数类Parameter
- 我们来继续研究 mybatis 框架sql映射文件的属性
- 开源.NET邮件服务器
- 次次获得《头脑王者》满分的秘诀
- 如何在ASP.NET 2.0中定制Expression Builders
- codeproject 几篇asp.net文章
- .NET Web 自动化测试工具
- Javascript数组常用方法[包含MS AJAX.NET的prototype扩展方法]示例
- 10步骤优化SQL Server 数据库性能
- 漫谈语音合成之Char2Wav模型
- [基础]Javascript中的继承示例代码
- javascript天生就具备类似c#中的"委托"功能
- 使用MonoDevelop开发跨平台的应用程序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 搞它!!!Linux系统LVM原理及磁盘配额(PV、VG、LV、PE的关系,手把手教你,嘴对嘴的传达)
- 搞它!!!linux网络服务基本设置命令合集
- 搞它!!!Linux系统上DHCP服务器的配置(理论加实验,分分钟搞定!!!)
- 搞它!!!Linux——引导、排障及修复
- 排障集锦:九九八十一难之第一难!linux发现交换文件无法打开文件!
- 排障集锦:九九八十一难之第三难!搭建DNS错误:Host xxxx not found: 2(SERVFAIL)
- 搞它!!!linux远程控制 openssh
- 搞它!!!Linux构建远程YUM仓库与NFS共享存储服务
- 排障集锦:九九八十一难之第四难! yum下载软件发现已存在的 RPM 数据库问题,无法下载,
- 搞它!!!深入了解DNS域名解析服务,教你搭建一个属于自己的DNS服务器(正向解析、反向解析、泛域名解析、邮件交换解析、别名解析、分离解析,主从结构解析)
- Nginx Ingress 高并发实践
- 搞它!!!2020年了,你还不会PXE+kickstart 一键式部署安装系统么
- shell脚本快速入门系列—————— shell脚本编程规范
- shell脚本快速入门系列之------条件语句(if、case)
- 搞它!!!2020年了你还不会Cobbler自动装机么(装机步骤,优化内容详解,导入系统镜像步骤,cobbler-web管理认证方式