当前位置:首页 » JAVA技术教程

scala笔记-函数

2018-03-12 08:20 本站整理 浏览(3)

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

 

测试代码:

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
  }
}