Scala零基础教学【21-40】

第24讲:Scala中SAM转换实战详解

SAM:single abstract method 单个抽象方法
 
我们想传入一个函数来指明另一个函数具体化的工作细节,但是重复的样板代码很多。
我们不关心它实现了什么接口的什么方法,只关心这个动作。比如下面的按钮点击一次,data就加1,而不关心ActionListener以及其回调方法。
那么就用隐式转换。这个后面会彻底地讲解。
 

第25讲:Scala中Curring实战详解

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

从数学的角度讲,这是一个对函数消元求解的过程:

def f(x:Int,y:Int)=x+y

def g(x:Int)=f(x,1)

def z=g(1)

z=2

那么z也可以写成这样:def z=(x:Int)=>(y:Int)=>x+y

例如:

def add(x:Int,y:Int)=x+y

柯里化后:

def add(x:Int)(y:Int)=x+y

实际实现是scala的语法糖,依次调用两个普通函数,第一次调用函数(x),第二次调用时使用了(x)的返回值。

def add=(x:Int)=>(y:Int)=>x+y

那么具体怎么实现柯里化呢?

假设我原始的普通函数 def add(x:Int,y:Int)=x+y

目标函数是Int=>Int=>Int (或者Int=>(Int=>Int))

大概长这样def add=(x:Int)=>(y:Int)=>x+y

抽象出来是[参数1=>参数2=>function(参数1,参数2)]
柯里化函数:
       def curry[A,B,C](f: (A, B) => C): A => (B => C) =  a => b => f(a, b)

curry: [A, B, C](f: (A, B) => C)A => (B => C)

用柯里化函数调用非柯里化函数add后:

def add(x:Int,y:Int)=x+y

def addCurry=curry(add)

addCurry: Int => (Int => Int)

测试:

addCurry(1)(2)

res10: Int = 3

 
package com.wanji.scala.function

object Curring {
  
  def main(args: Array[String]): Unit = {
    def multiple(x:Int,y:Int)=x*y
    def multipleOne(x:Int)=(y:Int)=>x*y
    println(multipleOne(6)(7))
    
    def curring(x:Int)(y:Int)=x*y
    
    println(curring(10)(10))
    val a=Array("Hello","Spark")
    val b=Array("Hello","spark")
    println(a.corresponds(b)(_.equalsIgnoreCase(_)))
    
  }
  
}

  

猜你喜欢

转载自www.cnblogs.com/sunrunzhi/p/9667795.html
今日推荐