Scala方法定義,方法和函數的區別,將方法轉換成函數


1. 定義方法和函數

1.1. 定義方法

這里寫圖片描述
方法的返回值類型可以不寫,編譯器可以自動推斷出來,但是對於遞歸函數,必須指定返回類型

1.2. 定義函數

這里寫圖片描述

1.3.方法和函數的區別

在函數式編程語言中,函數是“頭等公民”,它可以像任何其他數據類型一樣被傳遞和操作
案例:首先定義一個方法,再定義一個函數,然后將函數傳遞到方法里面
這里寫圖片描述

package cn.toto.scala /** * Created by toto on 2017/6/27. */ object MethodAndFunctionDemo { //定義一個方法 //方法m2參數要求是一個函數,函數的參數必須是兩個Int類型 //返回值類型也是Int類型 def m1(f:(Int,Int) => Int) : Int = { f(2,6) } //定義一個函數f1,參數是兩個Int類型,返回值是一個Int類型 val f1 = (x:Int,y:Int) => x + y //再定義一個函數f2 val f2 = (m:Int,n:Int) => m * n //main方法 def main(args: Array[String]): Unit = { //調用m1方法,並傳入f1函數 val r1 = m1(f1) println(r1) //調用m1方法,並傳入f2函數 val r2 = m1(f2) println(r2) } }

運行結果:

8
12

1.2. 將方法轉換成函數(神奇的下划線)
這里寫圖片描述
代碼如下:

package cn.toto.scala

/**
  * Created by toto on 2017/6/27. */ object TestMap { def ttt(f:Int => Int):Unit = { val r = f(10) println(r) } val f0 = (x : Int) => x * x //定義了一個方法 def m0(x:Int) : Int = { //傳遞進來的參數乘以10 x * 10 } //將方法轉換成函數,利用了神奇的下滑線 val f1 = m0 _ def main(args: Array[String]): Unit = { ttt(f0) //通過m0 _將方法轉化成函數 ttt(m0 _); //如果直接傳遞的是方法名稱,scala相當於是把方法轉成了函數 ttt(m0) //通過x => m0(x)的方式將方法轉化成函數,這個函數是一個匿名函數,等價:(x:Int) => m0(x) ttt(x => m0(x)) } }

 -------------------------

package com.cx.spark.demo

object MethodAndFunction {
  def main(args: Array[String]): Unit = {
    println(timeUUId)
  }


  //定義一個方法
  //方法m2參數要求是一個函數,函數的參數必須是兩個Int類型
  //返回值類型也是Int類型
  def m1(f: (Int, Int) => Int): Int = {
    f (2, 6)
  }

  //定義一個函數f1,參數是兩個Int類型,返回值是一個Int類型
  val f1 = (x: Int, y: Int) => x + y
  //再定義一個函數f2
  val f2 = (m: Int, n: Int) => m * n


  def max(a: Int, b: Int):Int = if (a > b) a else b  //定義方法

  val a: (Int, Int) => Int = max  //max會隱士轉化成函數,賦給變量(函數是一等公民),變量必須要指定參數類型
  //val a: (Int, Int) => Int = max()  //報錯

  var b = max _  //主動把方法轉成函數,賦個變量,不用指定函數參數

  var doubler = (x: Int) => x + 10  //定義函數

  var c = doubler  //函數間賦值


  def hf():Int  => Int = x => x+1  //定義一個方法,參數:空;返回值:參數為Int的函數
  var d = hf()  //調用函數,返回值(函數)賦給一個變量
  var e = hf  //括號省略了

  //Partial Functions 偏函數

  val pf : PartialFunction[Int , String] = {
    case 1 => "One"
    case 2 => "Two"
    case _ => "Other"
  }
  val pf2 :Int => String = {
    case 1 => "One"
    case 2 => "Two"
    case _ => "Other"
  }

  def safeStringOp(s:String, f:String=>String) = {
    if (s != null) f(s) else s
  }
  //匿名函數
  val uuid = java.util.UUID.randomUUID().toString

  val timeUUId = safeStringOp(uuid,
    { s =>
      val now = System.currentTimeMillis
      val timed = s.take(24) + now
      timed.toUpperCase
    }
  )


}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM