高阶函数
高阶函数可以将其他函数作为参数或者使用函数作为输出结果
//函数作为参数
def doSquare(f:Int=>Int,p:Int)=f(p)
def square(x:Int):Int=x*x
doSquare(square,square(2))
//函数作为返回值
//返回类型为函数(Int=>Int)
def doSquare()={
(x:Int)=>x*x
}
doSquare()(2)
常用高阶函数
- map
- foreach
- filter
- fold、foldLeft、foldRight
- reduce
- zip
- flatten
- flatMap
函数作为参数
object test {
def main(args: Array[String]): Unit = {
def fun1(a:Int,b:Int):Int=a+b
def fun2(a:Int,b:Int):Int=a-b
def fun3(a:Int,b:Int):Int=a*b
def fun4(a:Int,b:Int):Int=a/b
def funTest(f:(Int,Int)=>Int,a:String):String={
val resultValue=f(10,5)
a+resultValue
}
var str=funTest(fun1,"你的价格是:")
println(str)
}
}
函数作为返回值
object test {
def main(args: Array[String]): Unit = {
def funTest():(String,String)=>String={
def fun(a:String,b:String):String={
a+"b"+b+"d"
}
fun
}
var strValue=funTest()("a","c")
println(strValue)
}
}
传入一个字符,判断其长度,长度大于5加法,小于5减法,等于5乘法
object test {
def main(args: Array[String]): Unit = {
def funTest(s:String):(Int,Int)=>Int={
if(s.length>5){
def jia(a:Int,b:Int):Int={
a+b
}
jia
}else if(s.length<5){
def jian(a:Int,b:Int):Int={
a-b
}
jian
}else{
def cheng(a:Int,b:Int):Int={
a*b
}
cheng
}
}
var strValue1=funTest("aaaaaa")(10,5)
var strValue2=funTest("aa")(10,5)
var strValue3=funTest("aaaaa")(10,5)
println(strValue1)
println(strValue2)
println(strValue3)
}
}
传入一个数字,判断是否能被3整除,能被整除加法,不能被整除减法
object test {
def main(args: Array[String]): Unit = {
def funTest(s:Int):(Int,Int)=>Int={
if(s%3==0){
def jia(a:Int,b:Int):Int={
a+b
}
jia
}else{
def jian(a:Int,b:Int):Int={
a-b
}
jian
}
}
var strValue1=funTest(3)(10,5)
var strValue2=funTest(4)(10,5)
println(strValue1)
println(strValue2)
}
}
传入一个数字,判断是否能被3整除,能被3整除,相加大于等于3000,输出某某的收入很高,相加小于3000,输出某某再加把力;不能被3整除,相加大于等于3000,输出某某是一个节约的人,相加小于3,输出某某要省着点花钱哟
object test {
def main(args: Array[String]): Unit = {
def funTest(s:Int):(Int,Int)=>String=>Unit={
if(s%3==0){
def yes(a:Int,b:Int):String=>Unit={
if((a+b)>=3000){
def show(name:String):Unit={
println(name+"的收入很高")
}
show
}else{
def show(name:String):Unit={
println(name+"再加把力")
}
show
}
}
yes
}else{
def no(a:Int,b:Int):String=>Unit={
if((a+b)>=3000){
def show(name:String):Unit={
println(name+"是一个节约的人")
}
show
}else{
def show(name:String):Unit={
println(name+"要省着点花钱哟")
}
show
}
}
no
}
}
funTest(3)(3000,1000)("老王")
funTest(3)(1000,1000)("老王")
funTest(4)(3000,0)("老王")
funTest(4)(1000,1000)("老王")
}
}