文档章节

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

秋风醉了
 秋风醉了
发布于 2015/04/24 18:41
字数 572
阅读 29
收藏 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)


© 著作权归作者所有

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

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

Spark亚太研究院
2014/11/24
0
0
Java 8 和 Scala 中的 Lambda 表达式

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

散装海盗
2012/07/11
0
0
scala 重点理解

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

蓝狐乐队
2016/01/24
42
0
在下函数式编程有何贵干

函数式编程,一个一直以来都酷,很酷,非常酷的名词。虽然诞生很早也炒了很多年但是一直都没有造成很大的水花,不过近几年来随着多核,分布式,大数据的发展,函数式编程已经广泛投入到了实战...

力谱宿云
2016/07/07
779
8
Scala基础 - 函数和方法的区别

函数和方法 在Scala中函数是一等公民,你可以像操作数字一样将函数赋值给一个变量。使用val语句可以定义函数,def语句定义方法: 在Scala中无法直接操作方法,如果要操作方法,必须先将其转换...

joymufeng
2016/04/04
746
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud SpringBoot mybatis分布式Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用...

itcloud
16分钟前
0
0
c++ std::bind和std::function

定义于头文件 <functional> std::bind 函数绑定,https://zh.cppreference.com/w/cpp/utility/functional/bind // bind 用例#include <iostream>#include <functional> // 自定义的一......

SibylY
18分钟前
0
0
SecureCRT的安装与破解(过程很详细!!!)

SecureCRT的安装与破解(过程很详细!!!) SecureCRT的安装与破解(过程很详细!!!) 使用SecureCRT可以方便用户在windows环境下对linux主机进行管理,这里为大家讲一下SecureCRT的破解方...

DemonsI
23分钟前
0
0
介绍几款可用的web应用防火墙

目前有两款,基于软件和基于应用程序的web应用防火墙。基于软件的产品布置在Web服务器上,而基于应用程序的产品放置在Web服务器和互联网接口之间。两种类型的防火墙都会在数据传入和传出web...

上树的熊
29分钟前
1
0
用Visual Studio开发以太坊智能合约

区块链和以太坊 自从我熟悉区块链、以太坊和智能合约以来,一直失眠。 我一直在阅读,阅读和阅读,最后我能够使用一些工具,他们建议使用以太坊网站官方客户端应用程序(Ethereum Wallet)也...

geek12345
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部