Scala学习笔记-方法和函数
来源:互联网 发布:数据公司干什么的 编辑:程序博客网 时间:2024/05/31 05:28
Scala-方法和函数
Scala的强大在于支持函数式编程,同时它又基于Jvm(Java),所有通常是一门OO语言。
方法
在OOP中,方法作用于对象,是对象的行为,在Scala中的方法也是如此。
方法定义
定义方法的基本格式是:
def 方法名称(参数列表):返回值 = 方法体
scala中方法的返回值默认是方法体重的最后一行表达式 的值,当然也可以用return来执行返回值,但scala并不推荐这么做。
def function1(param1: String, param2: Int): String = { "[" + param1 + "]" + ",[" + param2 + "]" } def function2(param1: String, param2: String): String = { return "[" + param1 + "]" + ",[" + param2 + "]" }
*scala提供一些强大的功能:类型推断。在定义方法时,可以不显式 的制定方法的返回值,scala编译器可以根据函数体中的具体内容来推断方法的返回值类型
//返回类型被定义为String def function2(param1: String, param2: String) = { "[" + param1 + "]" + ",[" + param2 + "]" }
需要注意的是,若使用return
来制定函数的返回值,次数scala的类型推断将会失效,次数必须显式执行返回值类型。
def function2(param1: String, param2: String) = { //编译时报错 return "[" + param1 + "]" + ",[" + param2 + "]" }
def function2(param1: String, param2: String): String = { //通过编译 return "[" + param1 + "]" + ",[" + param2 + "]" }
方法也可以没有返回值(返回值是Unit)。
def function3(param1: String, param2: Double) { println("param1:" + param1 + ", param2: " + param2)}def function4(param1: String, param2: String): Unit = { println("param1:" + param1 + ", param2: " + param2)}
默认参数和带名参数
在定义方法参数时,可以为某个参数指定默认值,带有默认值的参数在被调用时可以不为其传入实参。
def function5(left: String = "<", content: String, right: String = ">"): Unit ={ println(left + content + right)}
上面定义的方法中,参数left
和right
已经指定默认值,可以用下面的方式进行调用
funciton5(content = "abcd")
这里有一点需要注意,当未被指定默认值的参数不是第一个参数时,参数名称不能省略
funciton5("abcd") ×
次数abcd被赋给了left,而content是没有值的。
当向方法中传入实参时,执行参数名称,则传入实参的顺序可以与定义时指定的参数顺序不一致
function5(right="]", left="[", content="abcd")
若不制定参数的名称,则必须按照方法的参数列表顺序进行传参
function5("[", "abcd", "]")
可变参数
当方法需要多个相同类型的参数时,可以用可变参数简化方法的定义
//从左到右拼接字符串def function6(strs: String*): String = { strs.reduceLeft( _ + _)}
此处strs是一个Sql[String]
def function7(values: Int*): Int = { values.reduceRight(_ + _)}
function7(1 to 10:_*)
*此处的 :_*
是将一个Range转成一个Seq
函数
在scala中,函数被看做是一等公民,可见函数有多么重要。此处只对函数做简要减少,后续文章深入探讨。
//定义函数 val f1 = (x: Int) => println(x) //打印 val f2 = (x1: Int) => x1 + 4 //将原数据+4
方法和函数存在 定义和使用上有一些区别
- 方法可以作为表达式的一部分,但方法不能作为最终表达式,函数可以作为最终表达式
scala> def func1(p: String) = println(p)func1: (p: String)Unitscala> func1<console>:12: error: missing arguments for method func1;follow this method with `_' if you want to treat it as a partially applied function func1 ^scala>
此处,func1是一个方法,但不能直接用func1调用,需要带上参数来调用
scala> func1("a");ascala>
- 参数列表对方法是可选的,对函数是必须的(函数参数列表可以为空)
scala> def func2 = println("no paramw")func2: Unit//定义函数时,参数列表可以为空,但不能省略scala> val f2 = => println("no param f2")<console>:1: error: illegal start of simple expressionval f2 = => println("no param f2") ^scala> val f2 = () => println("no param f2")f2: () => Unit = <function0>scala>
- 方法名意味着方法调用,函数名只代表函数本身
scala> func2no paramwscala> f2res10: () => Unit = <function0>scala>
- 在需要函数的地方可以提供一个方法(自动转换)
例如,高阶函数接收的是一个函数,但也可以传入一个方法,scala会将这个方法自动转义成函数。
def function8(x: Any) = println(x) val list = List[String]("a", "b", "c") list.foreach(function8(_))
foreach
是List对象的一个高阶函数,它接收一个函数,并应用于List中的每一个元素,而function8是一个方法。
- Scala学习笔记-方法和函数
- scala学习笔记:函数与方法
- Scala 学习(一)--- 方法和函数
- Scala方法和函数
- Scala学习笔记17【Scala偏函数】
- Scala 学习笔记(六)------Scala 函数嵌套
- scala学习笔记:理解函数
- scala学习笔记之函数
- scala函数使用--学习笔记
- scala学习笔记 之 函数
- Scala学习笔记2 - 控制结构和函数
- Scala学习笔记(二)表达式和函数
- Scala学习笔记-控制结构和函数(1)
- Scala学习笔记-控制结构和函数(2)
- Scala学习笔记-apply方法
- 学习Scala:Scala中的字段和方法
- scala中的函数和方法
- Scala中的方法和函数
- mac appium环境部署
- 次时代Java编程(一):Java里的协程
- js的浅克隆和深度克隆
- java使用JXL读写Excel
- 浅析 NodeJs 的几种文件路径
- Scala学习笔记-方法和函数
- C/C++获得当前程序路径
- MarkDown试水
- Objective-C面试题(精心整理的,附答案)
- NYOJ 540 奇怪的排序
- oracle case when 用法
- html5学习 一 html5选择器与json新方法html5拖拽
- TCP协议与UDP协议的区别
- Kettle的null与空字符串处理