scala 学习之三 Function 和 Method

scala 定义函数的关键字是 val

定义函数的通用格式是  val  函数名 = (参数列表)=> {函数体}

object FunctionDemo {

  //通用的定义格式
  val f1 = (x: Int, y: Int) => {
    x + y
  }

  //先定义函数的参数列表类型,具体的函数参数在函数体中定义
  val f2: (Int, Int, Int) => Int = {
    (x, y, z) => {
      x + y + z
    }
  }

  def main(args: Array[String]): Unit = {
    val v1 = f1(1, 2)
    println(v1)

    val v2 = f2(1, 2, 4)
    println(v2)

  }

}

在scala 中定义方法的关键字是 : def

定义方法的通用格式: def  方法名(参数列表) : 方法的返回值类型 = {方法体}

//方法的返回值不需要使用return关键字,同时方法的最后一条语句的返回值作为整个方法的返回值
//[注意]:如果一个方法有返回值,那么方法的最后一条语句的返回值,一定要和方法的返回值类型保存一致
def m1(x: Int, y: Int): Int = {
  var a = 1
  a += 2
  x + y
}

//可以省略掉方法的返回值类型,scala会自动根据最后一条语句的返回值推断出方法的返回值类型
  def m2(x: Int, y: Int) = {
    x + y
  }
//如果方法没有返回值,可以使用Unit来标注,变现为“()”,类似于java中的void
  def m3(x: Int, y: Int): Unit = {
    x + y
  }
//也是没有返回值的方法,在参数列表括号后面直接添加方法体{},我们称这种方法为过程
  def m3_3(x: Int, y: Int) {
    println(x + y)
  }
//先定义方法参数列表类型,具体的参数名称在方法体中
  def m4: (Int, Int, Int) => Int = {
    (x, y, z) => {
      x + y + z
    }
  }
//柯理化
  def m5(x: Int)(y: Int) = {
    x + y
  }

  //柯理化
  def m6(x: Int) = (y: Int) => {
    x + y
  }
//如果定义一个方法,方法名称后面的参数列表为空,那么在调用的时候可以加括号,也可以不叫括号
  def m7() = {
    println("hello world")
  }

  //如果定义一个方法,方法没有参数列表,那么在调用的时候也不能加“()”,否则编译不通过
  def m8 = {
    println("hello world")
  }
//递归方法要求我们必须写明方法的返回值类型,不能省略掉否则报错
  def m9(num: Int): Int = {
    if (num <= 0) 0 else m9(num - 1)
  }

  //当参数个数不固定时,那么这时候可以将参数定义为可变参数,可变参数要求是方法的最后一个参数
  def m10(name: String, nums: Int*): Unit = {
    var sum = 0
    for (num <- nums) {
      sum += num
    }
    println(name + "=" + sum)
  }
//在Scala中,有时我们调用某些方法时,不希望给出参数的具体值,而希望使用参数自身默认的值,
  // 此时就定义方法时使用默认参数
  //在调用方法的时候,赋值是从左往右依次赋值,所以说需要把没有默认值的放在最前面
  def m11(age: Int, name: String = "旺财", sex: String = "男") = {
    println(name + "=" + age + "=" + sex)
  }
def main(args: Array[String]): Unit = {
    /*   val sum = m1(1, 2)
       println(sum)
   */
    /*    val sum = m2(1, 3)
        println(sum)*/

    // println(m3(1, 2))

    //println(m5(2)(3))
    //    println(m6(3)(4))
    //m7
    // m8
    // m3_3(1, 3)
    // println(m9(9))
    // m10("旺财", 1, 2, 3, 4, 5)

    // m11(12)
    //带参数名调用,传入参数就可以无序
    m11(sex = "公", age = 12,name = "zs")

  }

}

在scala中方法可以转换成函数,有两种转换方法

第一种:下划线  :方法名

第二种:scala会隐式的去转换,不需要手动实现

object MethodToFunctionDemo {

  def m1(x: Int, y: Int) = {
    x + y
  }
  /**
    * 接收三个参数
    *
    * @param f 它是一个函数,接收两个参数,返回值是Int类型,在传入这个参数的时,传入进来的参数必须符合函数的签名
    * @param y 普通参数
    * @param x 普通参数
    * @return
    */

  def m2(f: (Int, Int) => Int, y: Int, x: Int) = {
    f(x, y)
  }
  def main(args: Array[String]): Unit = {
    //通过下划线将方法转换成函数
    // val f1 = m1 _
    // println(f1)

    //scala会自动进行转换
    //val v2 = m2(m1, 1, 2)
    // println(v2)

    val arr = Array(1, 2, 3, 4, 5)

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

    // arr.foreach(foreachFunchion)

    //arr.foreach((x: Int) => {println(x) })

    //arr.foreach((x: Int) => println(x))
    // arr.foreach((x) => println(x))
    // arr.foreach(println(_))

    val filterFunction = (x: Int) => {
       x > 3
    }
    arr.filter(filterFunction).foreach((x:Int)=>println(x))
  }
}

原文地址:https://www.cnblogs.com/mlfh1234/p/9222233.html

时间: 2024-10-10 06:06:27

scala 学习之三 Function 和 Method的相关文章

[Go语言]从Docker源码学习Go——function和method

function和method关系 method是针对某一类型定义的function, function可以单独调用,method必须针对某一类型的实例进行调用 //function 调用方式 packageName.FuncName() //method 调用方式 var t packageName.Type t.MethodName() 源码 func (cli *DockerCli) LoadConfigFile() (err error) { cli.configFile, err =

Scala 学习

1,Scala学习 官方网网站: http://www.scala-lang.org/ http://www.scala-lang.org/download/ 可伸缩的语言是一种多范式的编程语言,一种类似java的编程,设计初衷是要集成面向对象编程和函数式编程的各种特性. Scala是在JVM上运行. Scala有几项关键特性表明了它的面向对象的本质.例如,Scala中的每个值都是一个对象,包括基本数据类型(即布尔值.数字等)在内,连函数也是对象.另外,类可以被子类化,而且Scala还提供了基于

Spring MVC学习之三:处理方法返回值的可选类型

转自:http://www.cnblogs.com/cuizhf/p/3810652.html ———————————————————————————————————————————————————————————— spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: ModelAndView @RequestMapping("/show1") publ

Java并发学习之三——线程的中断

本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.一个多个线程在执行的Java程序,只有当其全部的线程执行结束时(更具体的说,是所有非守护线程结束或者某个线程调用System.exit()方法的时候),它才会结束运行.有时,你需要为了终止程序而结束一个线程,或者当程序的用户想要取消某个Thread对象正在做的任务. 2.Java提供中断机制来通知线程表明我们想要结束它.中断机制的特性是线程需要检查是否被中断,而且还可以决定是否相应结束的请求.所以,线程可以忽略中断请求并且继续运行. 3.

Scala学习笔记及与Java不同之处总结-从Java开发者角度

Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接. 语句能够不用";"结束.且推荐不适用";". 变量声明时以var或va

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建,去官网下载JDK8和Scala的IDE就可以了,Scala的IDE是基于Eclipse的. 下面直接上代码: 这是项目目录: A是scala写的: package first import scala.collection.mutable.ListBuffer object A { def main(args: Array[String]) { print("Hello,Scala");//学习程序设计的第一句 println("---");//pr

Spark之Scala学习

1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.thinksaas.cn/group/topic/93852/ 3. Spark之Scala学习网站 http://spark.apache.org/docs/latest/mllib-decision-tree.html 4. Spark wordcount开发并提交到集群运行: http://ww

scala学习(一)

开始学习scala,有一种学习java的感觉. 首先,从网站下载scala的包,下载后要安装,安装后把安装目录的bin放到环境变量psth里 cmd里,输入scala,如果出现下图,那么恭喜咯,安装成功咯~~ 1:变量 首先我们看下定义变量方法 var 可以定义变量,可以改变值 val 定义的变量不可以改变值,类似于java的final变量: 2:函数 如图定义了一个函数 def max(x:Int,y:Int):Int ={ if(x>y)x else y } def:表面定义函数 max :

cc2530 makefile简略分析 &lt;contiki学习之三&gt;

前面将contiki的makefile框架都理了下,这篇就以cc2530为收篇吧,也即makefile分析就该到此为止了. contiki/examples/cc2530dk 打开Makefile如下图: 第一行的 "CONTIKI_PROJECT"变量依赖于该目录下的  blink-hello.c  hello-world.c  sensors-demo.c  timer-test.c 4个C源文件 第五行的"CONTIKI"变量被定义成 contiki/ 路径,