函数式编程基础

一、函数和方法的区别

1、核心概念

    (1)未完成某一功能的程序语句的集合,称为函数。

    (2)类中函数称之为方法。

 

例子:

 1 object functionAndMEthod {
 2   def main(args: Array[String]): Unit = {
 3     //定义函数
 4     def sayHi(name: String): Unit ={
 5       println("hi," + name)
 6     }
 7     //调用函数
 8     sayHi("wl")
 9 
10     //调用对象方法
11     functionAndMEthod.sayHi("wll")
12 
13     //获取方法返回值
14     val result = functionAndMEthod.sayHello("xw")
15     println(result)
16   }
17 
18   //定义对象的方法
19   def sayHi(name: String): Unit ={
20     println("Hi," + name)
21   }
22 
23   def sayHello(name: String): String ={
24     println("hello," + name)
25     return "hello"
26   }
27 
28 }

编译:

 

 

 

 

二、函数定义

1、无参,无返回值

//1、无参, 无返回值
    def f1(): Unit ={
      println("1、无参, 无返回值!")
    }
    f1()
    println(f1())

 

 

 

2、无参,有返回值

//2、无参, 有返回值
    def f2(): Int ={
      println("2、无参, 有返回值")
      return 22
    }
    println(f2())

 

 

 

3、有参, 无返回值

def f3(name: String): Unit ={
      println("3、有参, 无返回值" + name)
    }
    //输出为()
    println(f3("wl"))

 

 

 

4、有参, 又返回值

 //4、有参, 有返回值
    def f4(name: String): String ={
      println("4、有参, 有返回值" + name)
      return "hi" +name
    }
    println(f4("wll"))

 

 

 

5、多参, 无返回值

//5、多参, 无返回值
    def f5(name1: String, name2: String ): Unit ={
      println("5、多参, 无返回值" )
      println(s"${name1}和${name2}都是我")
    }
    println(f5("dw", "xw"))

 

 

6、多参, 又返回值

//6、多参, 有返回值
    def f6(a: Int, b: Int): Int = {
      println("6、多参, 有返回值")
      return a + b
    }
    println(f6(10, 12))

 

 

 

 三、函数参数

1、可变参数

//1、可变参数
    def f1(str: String*): Unit = {
      println(str)
    }
    f1("sy")
    f1("wl", "xw", "dw")

 

 

 

2、如果参数列表中存在多个参数,那么可变参数一般放置在最后

//2、如果参数列表中存在多个参数,那么可变参数一般放置在最后
    def f2(str1: String, str2: String*): Unit = {
      println("str1" + str1 + "str2" + str2)
      f2("syy")
      f2("aaa", "bbb", "ccc", "ddd")
    }

 

3、参数默认值,一般将有默认值的参数放置在参数列表的后面

//3、参数默认值,一般将有默认值的参数放置在参数列表的后面
    def f3(name: String = "xwtx"): Unit = {
      println("My name is :" + name)
    }
    f3("wl")
    f3()

 

 

 

4、带名参数

//4、带名参数
    def f4(name: String,age: Int): Unit = {
      println(s"${age}岁的${name}")
    }
    f4("wwll", 22)
    //打乱顺序
    f4(age = 22, name = "wwl")

 

 

 

四、函数至简原则

1、return可以省略,scala会使用函数体的最后一行代码作为返回值

def f1(name: String): String = {
      name
   }
    println(f1("wl"))

 

2、如果函数体只有一行代码,可以省略花括号

//2、如果函数体只有一行代码,可以省略花括号
    def f2(name: String): String = name
    println(f2("wl"))

 

3、如果返回值的类型能够推断出来,那么可以省略(:和返回值类型一起省略)

def f3(name: String) = name
    println(f3("wl"))

4、如果有return,则不能省略返回值类型,必须指定

 

5、如果函数声明Unit,那么即使函数体使用return关键字也不起作用

 

6、scala如果期望是无返回值,可以省略等号

def f6(name: String) {
      println(name)
    }
    println(f6("wl"))

 

7、如果函数无参,但是声明了参数列表,那么调用时,小括号可加可不加

def f7(): Unit = {
      println("wll")
    }
    f7

 

8、如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略

def f8: Unit = {
    }
    f8

 

9、如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

def f9(name: String): Unit = {
      println("wll")
    }
        //匿名函数,或者叫lambda表达式
    (name: String) => {println(name)}

 

五、匿名函数的简化原则

val fun = (name: String) => {println(name)}
    fun("wl")

    //定义一个函数,以函数作为参数输入
    def f(func: String => Unit): Unit = {
      func("wll")
    }
    f(fun)

 

1、参数的类型可以省略,会根据形参进行自动的推导

f( (name) => {
      println(name)
    })

 

2、类型省略之后,发现只有一个参数,则圆括号可以省略,没有参数和参数超过1的永远       不能省略圆括号

f( name => {
      println(name)
    })

 

3、匿名函数如果只有一行,则大括号也可以省略

f( name => println(name))

 

4、如果参数只出现一次,则参数省略且后面参数可以用 _ 代替

f(println(_))

 

 

5、如果可以推断出当前传入的println是一个函数体而不是调用语句,可以直接省略下划线

f(println)

 

例子:

//实际示例: 定义一个“二元运算”函数,只操作1和2两个数,但是具体运算通过参数传入
    def OneAndTwo(fun: (Int, Int) => Int): Int ={
      fun(1, 2)
    }

    val add = (a: Int, b: Int) => a + b
    val minus = (a: Int, b: Int) => a - b
    println(OneAndTwo(add))
    println(OneAndTwo(minus))

    //匿名函数简化
    println(OneAndTwo(_+_))
    println(OneAndTwo(_-_))

 

posted @ 2022-04-19 09:45  小王同学学编程  阅读(174)  评论(0)    收藏  举报
levels of contents