欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scala笔记-函数

程序员文章站 2022-05-02 22:00:29
...

知识点:函数,匿名函数,高阶函数,偏函数

 

测试代码:

package demo.scala

object FuncTest {

  def main(args: Array[String]): Unit = {
    //    //1.try-catch
    //    try {
    //          1 / 0
    //    } catch {
    //      case e: ArithmeticException => println("除数不能是0")
    //      case e: Exception => println(e.getMessage)
    //    } finally {
    //      //TODO
    //      println("finally ...")
    //    }

    //    //2.case class在模式匹配中的应用
    //    testMatch(Student("li"))

    //    //把方法赋值给变量,两种写法
    //    val sayHelloObj = sayHello _
    //    val sayHelloObjet1 = sayHello(_)
    //    sayHelloObj("hello")

    //    //匿名函数可以赋给变量
    //    var obj = (name: String) => {
    //      println(name)
    //    }
    //    obj("hello")


    //3.高阶函数map,对集合中的每个元素做同样的操作
    var list = List(1, 2, 3)
    //map里是个匿名函数 y = f(x)形式
    println(list.map((x: Int) => x * 2))

    //参数类型推断,省略掉类型
    println(list.map((x) => x * 2))

    //匿名函数如果只有一个参数,可以省略掉括号
    println(list.map(x => x * 2))

    //占位符_代表list里的每一个元素(推荐写法)
    println(list.map(_ * 2))

    //4.filter过滤
    println(list.filter(_ > 2))

    //5.take取值
    println(list.take(2))

    //6.reduce对元素x和元素y进行处理,使用方法x+y,以此类推(从左往右连续的做+操作,即求list中的所有元素的和)
    list.reduce((x, y) => x + y)
    list.reduce(_ + _)

    //打印中间过程
    list.reduce((x, y) => {
      println(x + "," + y)
      x + y
    })

    //7.max,min,sum,count
    println(list.min)
    println(list.max)
    println(list.sum)
    println(list.count(_ >= list.min))

    //8.flatten 平铺
    var list2 = List(List(1, 2), List(3, 4))
    println(list2.flatten)

    //9.flatMap 扁平化
    println(list2.flatMap(_.map(_ * 2))) //结果:List(2, 4, 6, 8)
    println(list2.map(_.map(_ * 2))) //结果:List(List(2, 4), List(6, 8))

    //偏函数
    println(getScore("zhangsan"))
  }

  //普通写法
  def add1(x: Int, y: Int) = {
    x + y
  }

  //匿名函数赋给一个新的函数
  def add2 = (x: Int, y: Int) => {
    x + y
  }

  def sayHello(mess: String): Unit = {
    println(mess)
  }


  class Person

  //case class不用new,可以直接用,spark sql中用的非常多
  case class Teacher(name: String) extends Person

  case class Student(name: String) extends Person

  def testMatch(person: Person): Unit = {
    //case class在模式匹配中的是使用
    person match {
      case Teacher("wang") => println("this is teacher")
      case Student("lisi") => println("student lisi")
      case Student(name) => println("this is student")
      case _ => println("other")
    }
  }

  //偏函数(被包含在花括号里的一组没有match的case语句就是偏函数)
  def getScore: PartialFunction[String, Int] = {
    case "math" => 95
    case "english" => 98
    case _ => 60
  }
}