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和其他变量一样,我们可以像一个变量一样传递一个函数。

我们可以定义一个函数常量,然后将该常量赋值给一个变量。

以下代码定义了一个函数常量,它接受一个I​​nt参数,并返回一个值,该值是传递的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函数的更多相关文章

  1. Spark记录-Scala函数与闭包

    函数声明 Scala函数声明具有以下形式 - def functionName ([list of parameters]) : [return type] Scala 如果不使用等号和方法体,则隐式 ...

  2. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...

  3. Spark记录-scala快速入门

    1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...

  4. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

  5. Spark记录-Scala shell命令

    1.scala shell命令 scala> :help All commands can be abbreviated, e.g., :he instead of :help. :edit & ...

  6. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...

  7. Spark记录-Scala语法基础

    参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...

  8. Spark记录-Scala异常与处理

    Scala try-catch语句 Scala提供try和catch块来处理异常.try块用于包含可疑代码.catch块用于处理try块中发生的异常.可以根据需要在程序中有任意数量的try...cat ...

  9. Spark记录-Scala模式匹配

    Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...

随机推荐

  1. 设计模式 笔记 外观模式 Facade

    //---------------------------15/04/16---------------------------- //Facade 外观模式-----对象结构型模式 /* 1:意图: ...

  2. 让docker中的mysql启动时自动执行sql文件

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  3. Word或者WPS里证件照的背景底色和像素调整

    证件照的背景底色调整和像素调整         关于证件照的背景底色自行调整,比较方便的方法是用Word或者WPS来进行调整,当然也可以利用两者相结合的方法来进行调整,下面来系统的说一下这两种方式.此 ...

  4. Nmap命令

    命令行:(显示扫描过程 -v ) 扫描单个主机 #nmap www.hostName.com 扫描整个ip段(子网) #nmap 192.168.1.1/24 //表示当前ip下的24位掩码主机都要扫 ...

  5. 关于T/G/M/K

    //扫盲贴 K, G, T,都是表数量,只是个数字,在不同的场合下表示的不同.在计算机行业中,这几个量可用来表示数据传输速度和容量,下面分别讨论,希望不了解的朋友不要被某知道上的误解了.如果有什么错误 ...

  6. PAT甲题题解-1017. Queueing at Bank (25)-模拟

    有n个客户和k个窗口,给出n个客户的到达时间和需要的时长有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长.如果在8点前来的,就需要等到8点.如果17点以后来的,则不会被服务,无需考虑. 按客 ...

  7. 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  8. Daily Scrum - 12/02

    Meeting Minutes Shuo终于把文件存取弄好了!Wei大致把后端的代码整合好了,现在是可以基本实现算法的一个简易背单词版本.另外我们又交流了一下UI方面的事情,发现还是有一些问题(特别是 ...

  9. Beta阶段敏捷冲刺①

    1.提供当天站立式会议照片一张. 每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 1.1昨天已完成的工作. 姓名 昨天已完成的工作 徐璐琳 熟悉"慧记" ...

  10. func_get_args()在php71与php56的区别

    func_get_args() 获取函数的所有参数,返回一个数组 官方:http://www.php.net/manual/en/function.func-get-args.php 但是此函数在ph ...