Scala 函数式编程_函数是Scala中的一等公民

Scala 函数式编程_函数是Scala中的一等公民

一等公民表现在:

1.可以传递、赋值

2.嵌套函数和匿名函数

3.具有高阶函数

4.偏应用

5.闭包


1.可传递

first_class_function.scala

// 接收一个函数作为参数
def func(f: () => String) = println(f())
func(() => "hello world!") //传递一个匿名函数


def foo() = "hello world!"
func(foo) // 把foo函数作为一个参数传递

val fun = (x: Int) => print(x) // 定义一个函数 fun
fun(2)

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala first_class_function.scala

hello world!

hello world!

2


2.嵌套函数

def foo() {
  def bar() {
    println("hello world!")
  }
  bar //返回一个函数
}

foo //调用一个无参函数,可以不用加括号


3.匿名函数

lambda:函数字面量(Function  literal)

(x:Int,y:Int)  =>  x  +y

  参数  右箭头  函数体

上面语句产生一段匿名函数,类型为(Int,Int)  =>  Int

注意:scala中函数的参数个数为0到22个


4.高阶函数

第一种:用函数做参数的函数。eg:

def f2(f: () => Unit) {
  f()
}

def f1() {
  println(1)
}

f2(f1)
f2(() => println("hello world!"))

第二种:产生的结果是一个函数的函数。eg:

def hf(): Int => Int = x => x + 1

val fun = hf

fun(2) //output:3


5.函数柯里化

//当函数具有多个参数时
def sum(x: Int, y: Int) = x + y

//参数被打散后,两个参数分开
def sum2(x: Int)(y: Int) = x + y

sum2(1)(2) //output:3


// 直接返回一个函数
def first(x: Int) = (y: Int) => x + y
first(1)(2)

函数链

把一个带有多个参数的函数,转换为多个只有一个参数的函数来执行

f(1)(2)(3)  相当于  ((f(1))(2))(3)

带入参数  1执行  fa(1)  然后  带入参数2执行  fb(2)  接着带入参数3执行fc(3)  最后得到结果


6.闭包

在java中匿名内部类访问局部变量是,局部变量必须声明为final(类似闭包的实现)

scala>  (x:  Int)  =>  x  +  more
<console>:8: error: not found: value more
               (x:  Int)  =>  x  +  more
                                    ^

scala> val more = 1
more: Int = 1

scala> val addMore = (x: Int) => x + more
addMore: Int => Int = <function1>

scala> addMore(1)
res1: Int = 2

如下代码,

val more = 1
val addMore = (x: Int) => x + more

val res = addMore(1)
println(res)


转载于:https://my.oschina.net/xinxingegeya/blog/406055

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值