文档章节

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

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


© 著作权归作者所有

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

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

Spark亚太研究院 ⋅ 2014/11/24 ⋅ 0

Java 8 和 Scala 中的 Lambda 表达式

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

散装海盗 ⋅ 2012/07/11 ⋅ 0

scala 重点理解

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

蓝狐乐队 ⋅ 2016/01/24 ⋅ 0

在下函数式编程有何贵干

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

力谱宿云 ⋅ 2016/07/07 ⋅ 8

Scala基础 - 函数和方法的区别

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

joymufeng ⋅ 2016/04/04 ⋅ 0

参数类型推断 以及 柯里化

Scala 混合了面向对象以及函数式的特性。在函数式编程语言中,函数是头等公民,可以像其他任何数据一样被传递和操作。 参数类型推断 当你讲一个匿名函数传递给另一个函数或者方法时候,Scala...

blue1110 ⋅ 2015/01/20 ⋅ 0

了解一下Java 8 (一)

2015年公司发展迅速,于是大量的时间花费在招聘上。招聘工程师,必然需要了解候选人的技术能力,尤其是对自己使用的技术的了解程度。优秀的工程师都需要知其然,也知其所以然,否则遇到技术难...

TalkingData ⋅ 2016/01/20 ⋅ 8

函数和闭包之头等函数

什么是头等函数(First-class function)? 关于First-class function的介绍,可以参考:http://en.wikipedia.org/wiki/First-class_function In computer science, a programming language......

柳哥 ⋅ 2014/06/07 ⋅ 0

Scala控制结构、函数式编程解析讲解

首先,Scala的基本控制结构包括顺序、条件、循环控制结构三种方式,这和其他的JVM语言是一致的,但是Scala存在一些高级控制结构类模式匹配。 主要有if、for、while三种控制结构方式: 一、i...

csdn5215的博客 ⋅ 2017/12/16 ⋅ 0

第一类对象(First-class Object)

In programming language design, a first-class citizen (also object, entity, or value) in a given programming language is an entity which supports all the operations generally av......

Barudisshu ⋅ 2015/04/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 12分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 14分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 15分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 18分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 21分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 21分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 22分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 28分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 33分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 34分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部