Spark记录-Scala函数
Scala函数
Scala有函数和方法。
Scala方法是一个具有名称和签名的类的一部分。 Scala中的函数是一个可以分配给变量的完整对象。
函数定义可以出现在源文件中的任何位置。
不带参数的函数
在Scala中定义函数,请使用def
关键字,后跟方法名和方法体,如下所示。
- def hello() = {"Hello World!"}
等号=
用作方法签名和方法体之间的分隔符。
我们可以使用hello()
或hello
调用此函数。
- object Main {
- def main(args: Array[String]) {
- def hello() = {"Hello World!"}
- println(hello );
- }
- }
注意
我们还可以包括可选的返回类型,如下所示。
- def hello():String = {"Hello World!"}
我们可以从方法体中完全删除括号。
- def hello() = "Hello World!"
我们也可以从方法签名中删除括号。
- def hello = "Hello World!"
带参数的函数
以下代码显示如何使用参数创建函数。
- def square (i:Int) = {i*i}
- 函数的主体是表达式, 其中最后一行变为函数的返回值。
我们可以调用这个函数为square(2)。
- object Main {
- def main(args: Array[String]) {
- def square (i:Int) = {i*i}
- println(square(2) );
- }
- }
我们可以在函数中提供多个参数。多个参数之间用逗号分隔,如以下示例所示。
- def add(x: Int, y: Int): Int = { x + y }
我们现在可以通过将实际参数传递给add函数来调用这个函数。
- object Main {
- def main(args: Array[String]) {
- def add(x: Int, y: Int): Int = { x + y }
- println(add(5, 5) );
- }
- }
Scala函数编程
Scala允许我们将函数表达为文字。
函数文字允许我们有一个函数类型的表达式,我们可以写一个短格式,而不声明它的名称。
函数类型可以是以下之一:
- 可以为其分配函数的变量或参数的类型
- 采用函数参数的高阶函数的参数
- 返回函数的高阶函数的结果类型
函数常量以括号括起来的逗号分隔的参数列表开头,后跟箭头和函数体。
函数常量也称为匿名函数。
考虑一个add函数:
- val add = (x: Int, y: Int) => x + y
使用函数常量,您可以定义添加函数,如下所示:
- (x: Int, y: Int) => x + y.
函数常量被实例化为称为函数值的对象。
函数对象扩展FunctionN traits中的一个,例如Function0,Function1等等直到Function22。
根据函数中的参数数量,相应的FunctionN trait由编译器选择。
对于具有两个参数的函数,编译器选择Function2作为底层类型。对于具有3个参数的函数,编译器选择Function3,对于具有4个参数的函数,Function4等。
因为函数值是一个对象,它可以存储在一个变量中,它可以使用括号函数调用来调用,如下所示:
- object Main extends App {
- val add = (a: Int, b: Int) => a + b
- println(add(1, 2));
- }
一级函数和高阶函数
Scala函数是对象。
在函数式编程中,函数是一等公民函数。 一等公民函数可以
- 分配给变量,
- 作为参数传递给另一个函数
- 作为其他函数的值返回。
将函数作为参数或返回函数的函数称为高阶函数。
函数作为变量
正如我们可以传递String,Int和其他变量一样,我们可以像一个变量一样传递一个函数。
我们可以定义一个函数常量,然后将该常量赋值给一个变量。
以下代码定义了一个函数常量,它接受一个Int参数,并返回一个值,该值是传递的Int的两倍:
- (i: Int) => { i * 2 }
我们现在可以将该函数常量分配给一个变量:
- val doubler = (i: Int) => { i * 2 }
变量doubler
是一个函数的实例,称为函数值。
我们现在可以调用doubler,如下所示:
- doubler(2)
doubler
是Function1 trait的一个实例,它定义了一个接受一个参数的函数。
doubler
是使用关键字val
创建并分配给变量的函数。
函数作为参数
我们可以创建一个函数或一个方法,它将一个函数作为参数。
为此,首先定义一个将函数作为参数的方法。
- def operation(functionparam:(Int, Int) => Int) {
- println(functionparam(4,4))
- }
操作方法使用一个名为functionparam的参数,它是一个函数。
functionparam函数接受两个Int并返回一个Int
。
操作方法返回一个Unit,指示操作方法不返回任何内容。
接下来,定义一个与预期签名匹配的函数。以下add函数匹配该签名,因为它需要两个Int参数并返回Int:
- val add = (x: Int, y:Int) => { x + y }
现在我们可以将一个add函数传递给操作方法:
- object Main extends App {
- def operation(functionparam:(Int, Int) => Int) {
- println(functionparam(4,4))
- }
- val add = (x: Int, y:Int) => { x + y }
- operation(add)
- }
任何匹配此签名的函数都可以传递到操作方法中。
- object Main extends App {
- def operation(functionparam:(Int, Int) => Int) {
- println(functionparam(4,4))
- }
- val add = (x: Int, y:Int) => { x + y }
- operation(add)
- val subtract = (x: Int, y:Int) => { x - y }
- val multiply = (x: Int, y:Int) => { x*y }
- operation(subtract)
- operation(multiply)
- }
返回函数
我们可以从函数或方法返回一个函数。
为了做到这一点,首先定义一个匿名函数。下面的代码声明一个匿名函数,它接受一个String参数并返回一个String:
- (name: String) => { "hello" + " " + name }
现在我们将定义一个方法来返回我们刚才定义的匿名函数。
- def greeting() = (name: String) => {"hello" + " " + name}
在=符号的左侧有一个正常的方法声明:
- def greeting()
在右边的是一个函数文字:
- def greeting() = (name: String) => {"hello" + " " + name}
现在你可以将greeting()赋给一个变量:
- val greet= greeting()
因为匿名函数接受一个String参数名,我们可以传递一个名字:
- object Main extends App {
- def greeting() = (name: String) => {"hello" + " " + name}
- val greet= greeting()
- println(greet("Scala"))
- }
附录
- object function {
- def main(args:Array[String]):Unit={
- def hello() = {"Hello World!"} //无参数无返回值的函数
- def hello1() = "Hello World!"
- def hello2 = "Hello World!"
- println(hello );
- def hello3():String = {"Hello World!"} //无参数返回值为String的函数
- def square (i:Int) = {i*i} //带参数无返回值的函数
- println(square(2) );
- def add(x: Int, y: Int): Int = { x + y } //带多个逗号隔开参数且返回值为Int的函数
- println(add(3,4))
- val add1 = (x: Int, y: Int) => x + y //函数作为变量
- def operation(functionparam:(Int, Int) => Int) { //函数作为参数
- println(functionparam(4,4))
- }
- println(operation(add1))
- val subtract = (x: Int, y:Int) => { x - y }
- val multiply = (x: Int, y:Int) => { x*y }
- operation(subtract)
- operation(multiply)
- //返回函数
- def greeting() = (name: String) => {"hello" + " " + name}
- val greet= greeting()
- println(greet("Scala"))
- }
- }
Spark记录-Scala函数的更多相关文章
- Spark记录-Scala函数与闭包
函数声明 Scala函数声明具有以下形式 - def functionName ([list of parameters]) : [return type] Scala 如果不使用等号和方法体,则隐式 ...
- Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)
object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...
- Spark记录-scala快速入门
1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...
- Spark记录-Scala集合
Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...
- Spark记录-Scala shell命令
1.scala shell命令 scala> :help All commands can be abbreviated, e.g., :he instead of :help. :edit & ...
- Spark记录-Scala数组/List/Map/Set
import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...
- Spark记录-Scala语法基础
参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...
- Spark记录-Scala异常与处理
Scala try-catch语句 Scala提供try和catch块来处理异常.try块用于包含可疑代码.catch块用于处理try块中发生的异常.可以根据需要在程序中有任意数量的try...cat ...
- Spark记录-Scala模式匹配
Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...
随机推荐
- 移动端三合一瀑布流插件(原生JS)
没有前言,先上DEMO(手机上看效果更佳)和 原码. 瀑布流形式的图片布局方式在手机等移动端设备上运用广泛,比较常见的是下面前两种: 一.等宽等高 这种形式实现起来非常容易,这里就不再多说. 二.等宽 ...
- docker之搭建LNMP
一.部署mysql [root@node03 web]# docker run -itd --name lnmp_mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=1 ...
- 并发系列(一)-----synchronized关键字
一 简介 说到并发不得不提的synchronized,synchronized关键字是元老级别的角色.在Java SE 1.6之前synchronized被称为是重量,在1.6之后对同步进行了一系列的 ...
- 升级framework4.0后form认证票据失效的问题
好久没来了,密码都差点忘了,顺便记录下今天配置环境碰到的小问题 网站使用的form authentication做SSO登录,登录域名使用的framework20配置环境 一个栏目升级为4.0环境后, ...
- Linux内核分析——构造一个简单的Linux系统MenuOS
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...
- 20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)
Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- team330团队铁大兼职网站使用说明
项目名称:铁大兼职网站 项目形式:网站 网站链接:http://39.106.30.16:8080/zhaopinweb/mainpage.jsp 开发团队:team330 网站上线时间:2018年1 ...
- jqgrid查找
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...
- Feature List
我组最终决定所做的软件工程项目是Bing词典(UWP)的背单词模块,下面是初步定下的Feature List. 按用户场景变化顺序列举(假设是新用户): 1.用户可通过点击“背单词”标识或按钮进入背单 ...
- 老李的blog使用日记(2)
寥寥数语结束一个不曾期待的遇见,可还是剧情不会这样结束,他也会在我的时间里注册自己的专属账号,无论什么时候,他会时而需要被注视着,为了达到目的,即使不择手段,只为一次擦肩而过的邂逅,极短的一段时间,相 ...