zoukankan      html  css  js  c++  java
  • Scala学习——函数高级操作

    scala函数高级操作

    一、字符串高级操作

    多行字符串和插值

    package top.ruandb.scala.Course06
    object StringApp {
     
      def main(args: Array[String]): Unit = {
        val str =
          """
            |这是一个多行字符串
            |hello
            |lucy
            |lallalla
          """.stripMargin
         
        val say ="hello"
        val name = "lucy"
        println(say +": "+name )//传统字符串拼接
        println(s"$say: $name")//字符串插值操作
      }
    }

    二、匿名函数 

    package top.ruandb.scala.Course06
     
    /**
      * 匿名函数
      * (参数名:参数类型 ...) => 函数体
      * 可以把匿名函数传给一个变量
      * 可以把匿名函数传给一个函数
      */
    object FunctionApp {
     
      def main(args: Array[String]): Unit = {
        sayHello("lucy")
        a("lucy")
        say("lucy")
      }
     
      //常规函数
      def sayHello(name:String): Unit ={
        println(s"hello $name")
      }
      //匿名函数
      (name:String) => {println(s"hello $name")}
      //将匿名函数传给一个变量
      val a = (name:String) => {println(s"hello $name")}
      //将匿名函数传给函数
      def say =(name:String) => {println(s"hello $name")}
    }

    三、currying函数(柯里化函数)

    柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

    package top.ruandb.scala.Course06
    object FunctionApp {
     
      def main(args: Array[String]): Unit = {
          println(sum(1,9))
          println(sum1(1),(9))
      }
      //常规函数
      def sum(a:Int,b:Int): Int = a + b
      //currying函数
      def sum1(a:Int)(b:Int)=a + b
    }

    四、高阶函数

    高阶函数(Higher-Order Function)就是操作其他函数的函数

    package top.ruandb.scala.Course06
    object FunctionApp {
     
      def main(args: Array[String]): Unit = {
        //调用test,传入printName函数和lucy
        test(printName,"lucy")
      }
      def test(f:String => Unit ,name:String) = f(name);
      def printName(name:String): Unit ={
        println(s"my name  is $name" );
      }

    常用高阶函数

    package top.ruandb.scala.Course06
    object FunctionApp {
     
      def main(args: Array[String]): Unit = {
        val l =List(1,2,3,4,5,6,7,8,9);
        //map:逐个操作集合中的每个元素,所有集合类型都存在map函数
        l.map((x:Int) => x*10).foreach(println)
        //filter:过滤元素
        l.map( _ * 10).filter(_ > 30).foreach(println)//过滤大于30的元素
        //take:取前几个元素
        l.map( _ * 10).take(4).foreach(println)//取前4个元素
        //reduce:归纳、简化的意思,把容器中的元素作参数传给里面的二元匿名函数
        //函数体可以是求和,也可以是求积,等等,把容器中的元素归集起来返回。
        println(l.reduce(_ + _))  //45:相当于 1+2  3+3 6+4 .......
        println(l.reduceLeft(_-_))//-43: 相当于 1-2  -1-3 ......
        println(l.reduceRight(_-_))//5:相当于 1-(2-(3-(4-(5-(6-(7-(8-9)))))))
        //fold(折叠)函数将一种格式的输入数据转化成另外一种格式返回
        //fold操作需要从一个初始的“种子”值开始,并以该值作为上下文,处理集合中的每个元素。
        println(l.fold(10)(_*_))//3628800:相当于:((10*1)*2).......
        //foldLeft(),第一个参数为累计值,集合遍历的方向是从左到右
        println(l.foldLeft(10)(_-_))//-35:相当于((10-1)-2)-3........
        //foldRight(),第二个参数为累计值,集合遍历的方向是从右到左
        println(l.foldRight(10)(_-_))//-5:相当于1-(2-(3-(4-(5-(6-(7-(8-9))))))) - 10
        //max求最大
        println(l.max)
        //min求最小
        println(l.min)
        //sum求和
        println(l.sum)
        //flatten:可以把嵌套的结构展开.
        val f = List(List(1,2),List(3,4),List(5,6))
        println(f.flatten) //List(1, 2, 3, 4, 5, 6)
        //flatmap:结合了map和flatten的功能。接收一个可以处理嵌套列表的函数,然后把返回结果连接起来。
        println(f.flatMap(_.map(_*2)))//List(2, 4, 6, 8, 10, 12)
      }
     
    }

    五、偏函数

    偏函数(Partial Function),是一个数学概念它不是"函数"的一种, 它跟函数是平行的概念。

    Scala中的Partia Function是一个Trait,其的类型为PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果。

    package top.ruandb.scala.Course06
    object FunctionApp {
     
      def main(args: Array[String]): Unit = {
     
        println(pf("1"))
      }
      //偏函数:被包在花括号内没有match的一组case语句
      def pf:PartialFunction[String,String]={
        case "1" => "one"
        case "2" => "two"
        case _ => "other"
      }
     
    }
  • 相关阅读:
    第十周上机作业
    第九周上机作业
    第八周作业
    第八周上机作业
    第七周作业
    第七周上机作业
    第六周作业
    第六周上机作业
    第五周上机作业
    第四周作业
  • 原文地址:https://www.cnblogs.com/jnba/p/10677586.html
Copyright © 2011-2022 走看看