一.函数
函数声明
def functionName ([list of parameters]) : [return type]
1.定义无输入的函数
示例:
def hi="hi" scala>hi def hi():String="hi" scala>hi() scala>hi
2.定义函数
def functionName ([list of parameters]) : [return type] = { function body return [expr] }
示例:
//最后一行是函数的返回值 def multiplier(x:Int,y:Int):Int={x*y} def safeTrim(s:String):String={ if (s==null) return null s.trim() }
3.过程
过程是没有返回值的函数。以一个语句(如println()调用)结尾的函数也是一个过程。
返回类型为Unit 表示没有值。
示例:
def log(d:Double)=println(f"Got value $d%.2f") def log(d:Double):Unit=println(f"Got value $d%.2f")
4.用表达式块调用函数
使用一个参数调用函数时,可以利用一个大括号包围表达式发送参数,而不是用小括号包围值。
示例:
def formatEuro(amt:Double)=f"$amt%.2f" scala>formatEuro{val rate;0.2*rate+0.3}
5.递归函数
递归函数就是调用函数自身的函数,需要注意避免陷入无限循环。
示例:
def power(x:Int,n:Int):Long={ if(n>=1) x*power(x,n-1) else 1 }
6.嵌套函数
可以在函数中定义另一个内部函数,这个内部函数只能在该函数中使用。
示例:
def max(a:Int,b:Int,c:Int)={ def max(x:Int,y:Int)=if(x>y) x else y max(a,max(b,c)) }
7.用命名参数调用函数
在Scala中,可以按名调用参数,这样就不一定要按顺序指定参数。
示例:
def greet(orefix:String,name:String)=s"$prefix $name" val greeting=greet(name="Brown",prefix="Mr")
8.为函数参数指定默认值
示例:
def greet(name:String,orefix:String="")=s"$prefix $name" val greeting=greet("Brown")
9.Vararg参数
要标志一个参数匹配一个或多个输入实参,在函数定义中需要该参数类型后面增加一个星号(*)
示例:
def sum(items:Int*):Int={ var total=0 for(i<-items) total+=i total } scala>sum() res1:Int =0 scala>sum(10,20,30) res2:Int=60
10.参数组
把参数表分解为参数组,每个参数组分别用小括号分隔。
示例:
def max(x:Int)(y:Int)=if(x>y) x else y val larger=max(20)(19)
11.类型参数
类型参数指示了值参数或返回值使用类型,函数参数或返回值的类型不再固定。可以由函数调用者设置。
示例:
def identity[A](a:A):A=a val s:String=identity[String]("hello") val d:Double=identity[Double](2.345) //类型推导:Scala编译器可以推导出类型参数的类型,以及将赋为返回值的值的类型。 val s=identity("hello") val d=identity(2.345)
二.首类函数
“首类”表示函数不仅能得到声明和调用,还可以作为一个数据类型用在这个语言的任何地方。
1.函数类型
([<type>,...})=><type> , 有单个参数的函数类型可以省略小括号.
示例:
def double(x:Int):Int=x*2 val myDouble:(Int)=>Int=double myDouble(5) def logStart()="hello" val start:()=>String=logStart start()2.用通配符为函数赋值
示例:
def double(x:Int):Int=x*2 val myDouble=double_ myDouble(20)3.高阶函数
包含一个函数类型的值作为输入参数或返回值的函数
示例:
//定义带函数类型的值作为参数的函数 def safeStringOp(s:String,f:String=>String)={ if(s!=null) f(s) else s } def reverser(s:String)=s.reverse //调用函数 safeStringOp("Ready",reverser)4.函数字面量
示例:
val doubler=(x:Int)=>x*2 val doubled=doubler(20) val greeter=(name:String)=>s"Hello,$name" val hi=greeter("World") //3中例子可写成 safeStringOp("Ready",(s:String)=>s.reverse)5.占位符语法
占位符语法是函数字面量的一种缩写形式,将命名参数替换为通配符(_)。
示例:
val doubler:Int=>Int=_*2 //3中例子可写成 safeStringOp("Ready",_.reverse) def combination(x:Int,y:Int,f:(Int,Int)=>Int)=f(x,y) combination(23,12,_*_) res:Int=276 def tripleOp[A,B](a:A,b:A,c:A,f:(A,A,A)=>B)=f(a,b,c) tripleOp[Int,Double](23,92,14,1.0*_/_/_)6.部分应用函数
想重用一个函数,而且希望保留一些参数不想再次输入实,可以部分应用函数。
示例:
相关推荐
《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...
函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。
英文原版 scala函数式编程 function programming in scala
目前很多大数据组件都是用scala开发,包括Spark, Kafka, Flink,scala的函数式编程思想能够带来比java更高的效率,同时其可读性及难度升高,文档由浅入深介绍Scala的语法、特性等;
Scala函数式编
Scala 函数嵌套我们可以在 Scala 函数内定义函数,定义在函数内的函数称之为局部函数。
Scala函数式编程 2016年4月版 中文 Scala函数式编程 2016年4月版 中文
Scala函数和闭包
scala函数式编程-scalaz reader-monad state-monad functor applicative functor
25 scala函数式编程.7z
主要介绍了scala集合和函数的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
非常适合喜爱Scala编程的小伙伴学习,高清版,带完整版书签。
Spark RDD 算子说明,分别讲述了Transformation和Action这两类的算子。
2.2 细节对应的案例//0. 函数的标准写法//至简原则: 能省则省//1. return 可以省略,scala 会使用函数体最后一行代码作为返回值//2.
快学Scala课后习题答案,包含各个章节答案word版和pdf版
主要介绍了深入理解Scala函数式编程过程的相关资料,希望通过本文能帮助到大家,让大家学习理解这部分内容,需要的朋友可以参考下
主要介绍了Scala函数式编程的的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Coursera 在 Scala 中的函数式编程原则 洛桑联邦理工学院 Martin Odersky 的 Coursera Scala 函数式编程课程的作业和提交 第 0 周:00.example 本次作业的目标是让您熟悉本课程所需的基础设施和工具。 即使此作业的...