Scala高阶方法

Scala有一个当初差点挤掉JAVA地位的东西,就是高阶方法,也叫高阶函数,大家可以想一下JAVA的lambda表达式,或者是函数式接口这些JAVA推出的简化开发的方法,其实JAVA之所以推出这些就是因为Scala和它同用JAVA虚拟机,且开发又比它简单,再不出些东西,JAVA就可以拜拜了

高级方法的本质是将一个方法当做参数传入另一个方法中

举个例子,用JAVA的话想要过滤出一个集合中的东西,那么你需要写一个循环或者其他的工具类,但是Scala不用,Scala提供了高阶方法,你只需要提供一个处理的方法就可以了

package com.wy

object CollectionTest {
    
    

  def main(args: Array[String]): Unit = {
    
    
    var mymap = Map("book"->5,"pen"->2,"chizi"->6)

    //val filter: Map[String, Int] = mymap.filter(tmp=>(tmp._2>=5))
    val filter: Map[String, Int] = mymap.filter(_._2>=5)
    //println(filter)

    val mapreuslt: Map[String, Int] = mymap.map(tmp => tmp._1->tmp._2*2)
    //println(mapreuslt)

    val forechresult: Unit = mymap.foreach(tmp => println(tmp._1+"的值是:"+tmp._2))
  }
}

当然上面的这个例子是各API提供的高阶方法,我们需要的时候直接调用就可以了,我现在想给大家演示的是高阶函数内部到底是什么东西

首先我先给打下分析一下,高级函数的样子,下面是我写的一个高阶函数,用来给大家解释一下

def p(f: Int => String, v: Int){
    
    
	println(v)
}

首先不看参数,那么p方法其实就是一个接受两个参数,内部打印的普通方法

使它成为高阶方法的是f: Int => String这个参数,这是一个参数样式方法的表达式,也是高级方法接受其他方法时的表达式,下面简称参数方法

f: Int => String

这个表达式中f是参数方法的名字,Int指的是这个方法有一个Int型参数,=> String表示返回值是String,当然如果参数不止一个那么定义的时候,参数方法的参数位要用小括号包裹参数,比如

f: (Int,Float) => String

不过大家应该发现了,这个表达式,有名字、参数、返回值,但是没有方法体,其实这是因为这个表达式,只是规定了可传入方法的一个样子,当我们使用的时候只要符合这个样子的参数就可以使用,下面我给大家准备了一个单参数匿名方法,用来演示高级函数的使用,如下

val fun=(x:Int)=>{
    
    println(x)}

为了方便使用我将它赋值给了常量fun,下面我们来使用它

package com.dtdream.driver

object TTT {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //1、装备一个匿名方法,作用是拼接之后返回
    val fun=(x:Int)=>{
    
    x+"高阶函数内部拼接"}
    //2、上面的方法做参 调用高阶方法
    println(p(fun,21))

  }

  //3、高阶方法  指定返回值是因为要把值返回到main方法中
  def p(fun: Int => String, v: Int):String= {
    
    
    //4、实现逻辑
    fun(v)
  }

}

效果:

在这里插入图片描述

那现在可能还有些小伙伴没有反应过来,感觉和最前面的那个例子不一样,毕竟我们使用其他API提供的高阶方法时好像没有我准备的那个匿名方法

其实啊!这个是因为我们正常用的时候直接用了表达式,就拿我这个例子来说我完全可以不用先写那个匿名方法,直接在调用高阶函数的时候写成如下格式

	//用平常的写法写
    println(p(_+"高阶函数内部拼接",21))
    //完整的写法
    println(p(m=>{
    
    m+"高阶函数内部拼接"},21))

以上就是我要给大家分享的Scala的高阶方法,希望可以帮到大家

猜你喜欢

转载自blog.csdn.net/dudadudadd/article/details/112849949