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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我爱夜来香A

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

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

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

打赏作者

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

抵扣说明:

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

余额充值