一.函数
函数声明
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函数式编程-scalaz”所指的知识点涉及在Scala语言中使用Scalaz库来进行函数式编程。Scalaz是一个富类型库,它提供了许多扩展以增强Scala的函数式编程能力。它并不是Scala核心库的一部分,但为那些希望...
由于缺少具体内容,无法生成有关“Scala函数式编程”的详细知识点。如果您能提供具体的章节、段落或具有实际意义的内容,我将能够根据提供的信息撰写出符合要求的IT知识点。 然而,关于“Scala函数式编程”的话题,...
Scala 函数嵌套我们可以在 Scala 函数内定义函数,定义在函数内的函数称之为局部函数。
Scala函数和闭包
读书笔记:scala函数编程
读书笔记:scala函数式编程练习
25 scala函数式编程.7z
读书笔记:scala函数式编程语言例子
读书笔记:Scala函数式编程的习题答案
读书笔记:scala函数式编程书本练习代码
读书笔记:Scala函数式编程共学会课堂代码
Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念。在Scala中,函数式编程是其核心特性之一,它允许开发者以一种声明式而非命令式的方式处理问题,从而提高代码的可读性和可维护性。本文将...
读书笔记:《scala函数式编程》书本学习代码