Scala入门教程(中)

简介: Scala入门教程(中)
6. 基本函数

函数的形式如下所示:

def functionName ([list of parameters]) : [return type] = {
   function body
   return [expr]
}


在 Scala 命令行中,输入如下代码:

def add(a: Int): Int = {
    return a + 1
}
var res = add(1)
println(res)


image.png


代码解释:定义了一个add函数,返回类型为Int,参数a的类型也是Int,返回结果为参数+1,然后调用add函数,结果赋予res。简而言之,这就是一个加1的函数。


简洁写法:


如果函数不带参数,调用函数的时候可不写括号;

函数体中的语句如果只有一条表达式,可以省略函数的大括号。

如:


def add(): Int = 1 + 1
var res2 = add
println(res2)


image.png


7. 局部应用

局部应用(Partial application),也译作“偏应用”或“部分应用”;

def add(a: Int, b: Int) :Int = {
    return a + b
}
var add1 = add(1, _:Int)
var add2 = add1(2)
println(add2)


image.png


代码解释:定义了一个加法函数add,将其赋值给add1,即add1为新的函数,此处add(1, _:Int)的 _ 则为局部应用的体现,表示任意的参数,类似于一个通配符。 _ 也可以表示成一个匿名函数,在此不做过多解释,在大数据的代码中用非常多。add1(2),传入了一个参数,自动替换add(1, _:Int)的 _ ,可以简单了解为只是应用了部分的参数。


8. 柯里化函数

柯里化( Currying, 也译作“局部套用”),柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。


想象这样一种情景:一个乘法函数,在一个场景需要选择乘数,而另一个场景需要选择被乘数。


你可以直接传入两个参数,也可以填上第一个参数然后局部应用第二个参数。


def add(x: Int)(y: Int) :Int = {
    return x + y
}
var add1 = add(1)(2)
var add2 = add(2) _
var add3 = add2(3)
println(add1)
println(add3)


经过这个过程,就可以实现在你的函数上应用一些参数,然后又应用上另外的一些参数了。

其实这里跟局部应用相类似。


又如下面的一种场景,在scala中定义2个整数相乘运算的函数,具体如下:

def multiplie2par(x:Int,y:Int)=x*y


使用柯里化技术可以将上述2个整数的乘法函数改修为接受一个参数的函数,只是该函数返回的是一个以原有第二个参数为参数的函数。

def multiplie1par(x:Int)=(y:Int)=>x*y


代码解释:

multiplie1par(x:Int)为接收一个参数的新等价函数,(y:Int)=>x*y则是新等价函数的返回体,它本身就是一个函数(严格上讲应该是一个匿名函数),参数是除了等价新函数的参数外原函数剩余的参数。其实就是参数 x,然后函数体里面的参数为 y,变换了位置了。


上述使用柯里化技术得到的等价新函数,在 Scala 语言中还可以进一步简化,将第一个等号去掉,将 => 写成等号 =:

def multiplie1par1(x:Int)(y:Int)=x*y

此处与普通函数的区别是这里的两个参数是写成两个括号的,不是一个括号。


9. 可变长度参数

我们可以向方法中传入任意多个同类型的参数。例如要在多个字符串上执行 String 的 Capitalize 函数:


// 把所有单词改为首字母大写
def capitalizeAll(args: String*) = {
    args.map { arg =>
        arg.capitalize
    }
}
var str = capitalizeAll("shao", "nai", "yi")
println(str)


image.png


10. 类
class Calculator {
    val name: String = "shaonaiyi"
    def add(m: Int, n: Int): Int = m + n
}
val calc = new Calculator
println(calc.name)
println(calc.add(1, 1))


image.png


代码解释:定义了一个 Calculator 类,在类中用 def定义方法和用val定义字段值。

11. 构造函数

构造函数不是特殊的方法,他们是除了类的方法定义之外的代码。增加一个构造函数参数,并用它来初始化内部状态。


// 这是一个构造函数
class Calculator(name: String) {
    val color: String = if (name == "shaonaiyi") {
        "red"
    } else if (name == "shaonaier") {
        "green"
    } else {
        "blue"
    }
    // 实例方法
    def add(m: Int, n: Int): Int = m + n
}


// 使用构造函数来构造一个实例
val calc = new Calculator("shaonaier")
calc.color


image.png


Scala 是高度面向表达式的:大多数东西都是表达式而非指令。我们将颜色的值就是绑定在一个if/else表达式上的。


相关文章
|
4月前
|
分布式计算 Java Hadoop
Scala入门必刷的100道练习题(附答案)
Scala入门必刷的100道练习题(附答案)
242 1
|
4月前
|
Java 大数据 Scala
Scala入门【运算符和流程控制】
Scala入门【运算符和流程控制】
|
4月前
|
Java Shell API
Scala入门【变量和数据类型】
Scala入门【变量和数据类型】
|
6月前
|
安全 Java 编译器
Scala语言入门:初学者的基础语法指南
作为一种在Java虚拟机(JVM)上运行的静态类型编程语言,Scala结合了面向对象和函数式编程的特性,使它既有强大的表达力又具备优秀的型态控制
27 0
|
11月前
|
JavaScript 前端开发 Java
Scala语言入门以及基本语法
Scala语言入门以及基本语法
|
分布式计算 Java 程序员
spark开发基础之从Scala符号入门Scala
spark开发基础之从Scala符号入门Scala
135 0
spark开发基础之从Scala符号入门Scala
|
开发框架 分布式计算 Java
十分钟带汝入门大数据开发语言Scala
Scala是一门多范式的编程语言,一种类似Java的编程语言 ,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。目前最主流的大数据开发框架Spark的实现就是通过Scala去实现的。Scala可以与Java互操作。它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码),也可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。
十分钟带汝入门大数据开发语言Scala
|
存储 Java 大数据
Scala入门教程(下)
Scala入门教程(下)
205 0
|
消息中间件 分布式计算 Java
Scala入门教程(上)
Scala入门教程(上)
429 0
Scala入门教程(上)
|
搜索推荐 关系型数据库 Shell
Scala入门系列终章:类与对象
截至本篇,Scala入门系列即将告一段落,先后用7篇文章将Scala语言的四梁八柱进行了简要介绍,虽然阅读量相较于其他文章更为惨淡,但相信对于有一定编程语言基础又想快速入门Scala的读者来说还是会有一定收获和借鉴的。 本文作为该系列的最后一篇,将重点介绍Scala中类和对象的概念,毕竟Scala也是一门面向对象的编程语言。 坦白讲,个人在学习Scala中这一部分内容时其实也是有些凌乱的,一直觉得未能理解到Scala中类和对象的精髓,所以当下完成此文也仅仅是出于系列内容的完整性,后续也将适时推出其他分享。
142 0
Scala入门系列终章:类与对象