Scala学习:类型推断及函数式编程

一、类型推断(无需显式指定函数类型)

val msg = "Hello World!"
//等价于val msg:String = "Hello World!"
//scala编译器会自动帮我们推断出变量的类型
  • val定义变量表示变量不可被重新赋值,类似于java中final变量
  • var定义变量可以被重新赋值
msg = "Hello ge Der"
//会报错

1、定义函数

def max(x:Int,y:Int):Int = { if (x > y) x else y}
//函数参数需要显式指定参数类型,scala编译器不会帮我们做推断
//scala中的结尾;可有可无
:Int表示返回的结果类型,可以省略
def max(x:Int,y:Int) = { if (x > y) x else y}
//但是如果函数是递归的(函数里会调用到自己),就不能省略结果类型,上述函数没有调用到自己
def max(x:Int,y:Int) = if (x > y) x else y
//如果函数中只有一条语句,花括号也可以省略

2、编写脚本文件

var i = 0
while ( i < args.length){
	if (i != 0){
		print(" ")
	}
	print(args(i))
	i += 1
}
println()
  • 命令行参数可以通过args数组获取,取数组的值不必类似于Java的args[i], 用圆括号args(i)即可获取
  • while或if语句的boolean表达式,必须用圆括号括起来
  • 指定scala脚本使用scala 名称.scala即可

二、函数式编程

上述脚本文件中的whilexunhuan,实际上是以指令式的风格编程,也是类似于Java/C++等语言通用的风格,依次给出指令,通过循环来遍历,scala允许使用指令式的编程风格,但更倾向于使用函数式

args.foreach(arg => println(arg))
//等价于上面的scala脚本,对args执行foreach()方法,括号内左边是参数,右边是函数体

1、返回值:scala中,不需要return来返回函数的值,函数最后一行语句的值,就是函数的返回值
2、函数赋值

Scala中的函数是一等公民,可以直接将函数作为值赋值给变量
注意:将函数赋值对变量时,必须在函数后面加上"_""(_)"
eg:
def sayHello(name:String) = "Hello," + name
val hello = sayHello _
val hello = sayHello(_)

3、匿名函数:(参数名:参数类型) => 函数体

val hi = (name:String) => "Hello," + name

4、高阶函数:接收函数作为参数的函数或返回值为函数的函数称为高阶函数

//常用高阶函数
1)、map:对传入的每个元素都进行映射,返回一个处理后的元素
Array(1,2,3,4,5).map(_ * 10)等价于Array(1,2,3,4,5).map(i => i * 10)
2)、foreach:对传入的每个元素都进行处理,但是没有返回值
Array(1,2,3,4,5).map(_ * 10).foreach(println _)
3)、filter:对传入的每个元素都进行条件判断,如果对元素返回true,则保留该元素,否则过滤掉该元素
(1 to 50).filter(_ % 10 == 0)
4)、reduceLeft:从左侧元素开始,进行 reduce 操作,即先对元素1和元素2进行处理,然后将结果与元素3处理,再将结果与元素4处理,依次类推,即为 reduce
(1 to 4).reduceLeft(_ * _)相当于1 * 2 * 3 * 4

5、闭包:
闭包是一个函数,返回值依赖于函数外部的一个或多个变量

var factor = 3
val mul = (i:Int) = i + factor
在函数mul中有两个变量,i为函数的形参,但factor是外部自由变量
函数mul成为一个闭包,因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数,形成闭包

6、柯里化

柯里化指将原来接收N个参数的一个函数,转换为N个函数
def add(a:Int,b:Int) = a + b
等价于
def add(a:Int) = (b:Int) => a + b
等价于
def add(a:Int)(b:Int) = a + b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第三章介绍了Scala的函数和方法,以及它们的区别。具体内容如下: 1. 函数和方法的区别:函数是一段可以独立调用的代码,它可以像变量一样被传递、返回和赋值;而方法是属于某个对象或类的一段代码,它必须通过对象或类来调用。 2. 函数的定义方式:可以使用def关键字定义函数,也可以使用匿名函数(lambda表达式)。 3. 函数的参数:Scala的函数可以没有参数,也可以有多个参数。参数可以有默认值,也可以是可变参数。 4. 函数的返回值:Scala的函数可以没有返回值,也可以有返回值。返回值类型可以显式声明,也可以自动推断。 5. 方法的定义方式:方法必须定义在对象或类中,使用def关键字表示。方法可以有访问修饰符和参数列表,也可以有返回值类型和方法体。 6. 方法的参数:和函数一样,方法可以有多个参数,也可以有默认值和可变参数。 7. 方法的返回值:方法必须有返回值类型,如果没有显式声明,则默认返回Unit类型。 8. 函数和方法的调用:函数可以直接调用,也可以通过变量、高阶函数等方式调用;方法必须通过对象或类来调用。 9. 函数式编程的特点:函数式编程强调函数的纯粹性、不可变性和高阶函数的使用,它能够简化代码、提高可读性和可维护性。 总之,Scala的函数和方法都是非常重要的编程工具,它们可以让我们更加灵活地组织代码,提高开发效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱夜来香A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值