Scala-方法和函数

1、方法的定义

//def用来表示定义一个方法,m1表示方法名,(x:Int,y:Int)是参数列表(参数名:参数类型...),Int = x + y中Int表示返回值类型,x + y则是方法体(当然也可以跟java一样使用{}包起来)
scala> def m1(x : Int, y : Int) : Int = x + y
m1: (x: Int, y: Int)Int
//调用函数
scala> val res = m1 (3,4)
res: Int = 7

函数值的返回类型也可以不用指定,会自动判断

//可以看到能自动判断返回值类型是Int,但是“=”还是要的
scala> def m1 (x : Int,y : Int) = x * y
m1: (x: Int, y: Int)Int

scala> val res1 = m1(3,4)
res1: Int = 12

定义无返回值类型的方法
如果方法体有多行语句,使用{}括起来

scala> def m1 (x : Int,y : Int) {
     | print(x+y)
     | }
m1: (x: Int, y: Int)Unit

scala> m1(5,6)
11
或者
scala> def m1 (x : Int,y : Int) :Unit = {
     | println(x * y)
     | }
m1: (x: Int, y: Int)Unit

scala> val res = m1(3,7)
21

上面都是返回单一值,也可以返回对偶元祖或者多个值

scala> def m1 (x : Int, y : Double) = (y,x)
m1: (x: Int, y: Double)(Double, Int)

scala> val res = m1(3,4.4)
res: (Double, Int) = (4.4,3)

2、函数的定义

//定义了匿名函数,没有"val 变量名="
scala> (x : Int, y : Int) =>  x * y
//res2表示变量名,使用它来调用函数,(Int,Int)则表示两个参数都是Int类型 Int = <function2>表示返回一个Int类型的值,函数体使用了两个参数
res2: (Int, Int) => Int = <function2>

scala> res2(3,4)
res3: Int = 12

//将匿名函数赋给变量f1(其实是不可变量value,但是还是称变量)
scala> val f1 = (x : Int, y : Int) =>  x + y
f1: (Int, Int) => Int = <function2>

scala> val res = f1(5,5)
res: Int = 10

scala> val f2 = (x: Int) => x * 10
f2: Int => Int = <function1>

scala> val res = f2 (7)
res: Int = 70

函数定义的另一种方式

//x表示传入的Int值,结果是x转String相当于val func = (x:Int) => x.toString
scala> val func: Int => String = {x => x.toString}
func: Int => String = <function1>

scala> val func2 = (x : Int) => x.toString
func2: Int => String = <function1>

scala> func(3)
res14: String = 3

scala> func2(3)
res15: String = 3
==============
scala> val func3 : (Int,Int) => Int = {(x,y) => x + y}
func3: (Int, Int) => Int = <function2>

scala> val func4 = (x :Int, y : Int) => x + y
func4: (Int, Int) => Int = <function2>

3、方法和函数的区别
在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作
案例:首先定义一个方法,再定义一个函数,然后将函数传递到方法里面

//定义m1方法,f : (Int, Int) => Int表示参数是个函数,该函数的参数列表有2个Int类型的形参,返回值是一个Int类型。该方法体中调用这个函数,所以返回类型自动判断也就是函数的返回类型。
scala> def m1 (f : (Int, Int) => Int) = {
     | f(4,7)
     | }
m1: (f: (Int, Int) => Int)Int

//定义要传入方法的函数
scala> val func = (x : Int, y : Int) => x * y
func: (Int, Int) => Int = <function2>

调用方法,传入函数
scala> val res = m1(func)
res: Int = 28
scala> val ran = 1.to(10)
ran: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val f1 = (x : Int) => x * 2
f1: Int => Int = <function1>

scala> val result = ran.map(f1)
result: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

scala> val f2 = (x : Int) => x+10
f2: Int => Int = <function1>

scala> var result2 = ran.map(f2)
result2: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

//直接传个匿名函数(x:Int) => x * 5
scala> ran.map((x:Int) => x * 5)
res9: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)

//更简单的方式x => x * 5,x表示ran中的元素,x * 5表示对ran中的元素进行的操作,结果放入的新的集合中去。
scala> ran.map(x => x * 5)
res10: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)

//最简单的方式“_”表示ran中的元素
scala> ran.map(_ * 5)
res11: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)

4、将方法转换为函数
使用神奇的下划线”_”

scala> def m1 (x: Int, y :Int) = x + y
m1: (x: Int, y: Int)Int
//使用 函数名 空格_将m1这个方法转换成了函数
scala> val func1 = m1 _
func1: (Int, Int) => Int = <function2>

//调用由方法转换成的函数
scala> val result = func1(3,4)
result: Int = 7

//原来的方法并不改变
scala> m1(3,4)
res7: Int = 7

scala> val arr = Array (1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)

scala> var a1 = arr(1)
a1: Int = 2

scala> arr(1) = 100

scala> arr
res13: Array[Int] = Array(1, 100, 3, 4, 5)

注:val定义的不能修改指的是变量的引用不能改,但是数组内容可以修改。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容