文档章节

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

秋风醉了
 秋风醉了
发布于 2015/04/24 18:41
字数 572
阅读 33
收藏 0

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)


© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 239
博文 572
码字总数 416654
作品 0
朝阳
程序员
私信 提问
【Spark亚太研究院系列丛书】Spark实战高手之路-第2章动手实战Scala第1小节(2)

2,Scala函数特性编程实战 当函数不带参数的使用,我们调用的时候可以省略括号: 接下来定义一个匿名函数、调用并运行: 在Scala总函数式一等公民 ,所以我们可以把函数付给一个常: 另外一个...

Spark亚太研究院
2014/11/24
0
0
【Scala】Scala中的函数式编程及集合操作

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/81988990 1、Scala中的函数式编程简介 Scala中的函数是Java中完全没有的概念。...

魏晓蕾
08/23
0
0
Springboot中使用Scala开发

使用SB與Scala 項目代碼 本章項目代碼: https://github.com/LightSwordSpringBoot/lightsword JVM上的語言家族 JVM上的語言 1)Clojure是一个函数编程语言(functional programming language...

程序员诗人
2016/06/26
0
0
scala 重点理解

1、private[this] 对象私有属性 在scala中,如果使用private[this],表示该属性只能属于当前对象私有,不能被当前对象的类方法使用 class Person { private[this] var name ="蓝狐" def isN...

蓝狐乐队
2016/01/24
42
0
Java 8 和 Scala 中的 Lambda 表达式

这篇文章是infoQ上面关于java 8 和 scala 特性比较的一部分,原文实在是太长了,,分段翻译,先贴出来一部分,翻译的不好,欢迎拍砖。。。原文地址 Java8 终于要支持Lambda表达式!自2009年以...

散装海盗
2012/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
5
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
23
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
18
0
my.ini

1

architect刘源源
今天
16
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部