函数式编程
函数式编程
package chapter01 object test03 { def main(args:Array[String]):Unit={ //函数式编程 //函数的范式 //面向对象,解决问题时,将问题拆解成一个一个小问题(形成对象),分别解决:继承,实现,重写,多态 //函数式编程,问题的解决方案(封装功能),重点在于函数的入参,出参(返回值) //java中的方法和scala中的函数都可以进行功能的封装,但是方法必须和类型绑定,函数不需要 // java 函数的声明:public static void test(String s){} //scala 声明函数 def test(s:String):Unit={ println(s) } //调用函数 test("zhang") } }
package chapter01 object test4 { def main(args:Array[String]):Unit={ //函数没有重载概念,同一个作用域中函数名不可以相同 //scala中没有throw关键字,所以函数中如果有异常发送,不需要在函数申明时抛出异常 //1.无参,无返回值 def test():Unit={ println("test") } test() //2.有参,无返回值 def test2(s:String):Unit={ println(s) } test2("test2") //3.有参,有返回值 def test3(s:String):String={ return s+"hello" } val result3=test3("test3") println(result3) //4.无参,有返回值 def test4():String={ return "hello" } val result4=test4() println(result4) } }
package chapter01 object test05 { def main(args:Array[String]):Unit={ //scala可以采用自动推断功能来简化函数的声明 //如果函数声明中,明确无返回值Unit,那么即使函数体中有return也不起作用 def test():Unit={ return "hello" } println(test())//() //如果函数体的最后一行代码进行返回,那么return可以省略 def test1():String={ "hello" } println(test1()) //如果可以根据函数的最后一行代码推断返回值类型,那么函数的返回值类型可以省略 def test2()={ "scala" } println(test2()) //如果整个函数体当中只有一行代码,{}可以省略 def test3()="zhang" println(test3()) //如果函数声明中没有参数列表,()省略,调用时也不加();如果()没有省略,调用时可加可不加() //声明函数必须加def def test4="wang" println(test4) //函数声明没有返回值,=可以省略 def test5(){ "hello scala" } println(test5()) //() //匿名函数 ()->{println("***********")} } }
package chapter01 object test06 { def main(args:Array[String]):Unit={ //可变参数 def test(name:String*):Unit={ println(name) } //调用时,可以传多个参数,也可以不传参数 test("zhang shan","li si") //WrappedArray(zhang shan, li si) test()// List() //默认参数 def test2(name:String,age:Int=20):Unit={ println(s"${name}-${age}") } test2("zhang shan")//zhang shan-20 test2("zhang shan",30)//zhang shan-30 //调用函数时,参数匹配规则为从前到后,从左到右 def test3(name1:String,name2:String="li si"):Unit={ println(s"${name1}-${name2}") //zhang shan-li si } test3("zhang shan") //带名参数 test3(name1="zhang shan") } }
package chapter01 object test07 { def main(args:Array[String]):Unit={ //1.函数可以赋值给变量 //1.函数可以作为函数的返回值 def f():Unit={ println("function") } def f0()={ //返回函数 //直接返回函数,有问题,增加特殊符号 f _ } f0()() //闭包 //一个函数在实现逻辑时,将外部的变量引入到函数得内部,改变了这个变量得生命周期,称之为闭包 def f1(i:Int)={ def f2(j:Int):Int={ i*j } f2 _ } val result=f1(2)(3) println(result) //函数柯里化 def f3(i:Int)(j:Int):Int={ i*j } println(f3(2)(3)) //2.函数可以作为函数的参数 //参数列表=>返回值类型 def f4(f :()=>Int):Int={ f()+10 } def f5():Int={ 9 } println(f4(f5))
def f9(f :(Int)=>Int):Int={
f(10)
}
def f10(i:Int):Int={
i
}
println(f9(f10))
//使用匿名函数优化代码 def f6(f:()=>Unit):Unit={ f() } def f7():Unit={ println("XXXXXXXXXX") } println(f6(f7)) f6(()=>{println("XXXXXXXXX")})
def f8(i:Int):Unit={
println(i)
}
//()参数列表,{}逻辑代码
f7((i:Int)=>{println(i})
f7((i)=>{println(i)}) //Int类型可以省略
f7((i)=> println(i) )//只有一行代码,{}可以省略
f7(println(_)//参数只用一次,参数可以写成_
f7(println)//参数只用一次,参数可以省略
def f8(F:(Int,Int)=>Int):Int={`- 自行车v不那么,。/\
\
f(10,10)
}
f8((x:Int,y:Int)=>{x+y})
f8((x,y)=>{x+y}) //Int类型可以省略
f8((x,y)=>x+y) //只有一行代码,{}可以省略
f8(_+_)//参数只用一次,可以省略
}
}
package chapter01 object test08 { def main(args:Array[String]):Unit={ //递归 //1.函数的逻辑代码调用自身 //2. 函数在调用自身时,传递得参数应该有规律 //3.函数应该有跳出递归的逻辑,否则出现死循环 //4.递归函数无法推断函数返回值类型,所以必须有返回值类型 def f(i:Int):Int={ if(i==1){ return 1 }else{ i*f(i-1) } } print(f(4)) } }
posted on 2020-07-13 15:32 happygril3 阅读(168) 评论(0) 收藏 举报
浙公网安备 33010602011771号