匿名函数
函数可以没有名称,可以直接赋值。如果函数有多行表达式组成,就加上大括号。这一点对匿名函数同样适用。
scala> val addOne = (x: Int) => x + 1
addOne: (Int) => Int = <function1>
scala> addOne(1)
res4: Int = 2
注意到Scala中一切都是对象。所以addOne
是一个对象。同时它又是个包含一个参数的函数。此时,函数和对象得到了统一。
偏函数应用 (Partial Application)
偏函数应用解决这样的问题:如果我们有函数是多个参数的,我们希望能固定其中某几个参数的值。在Scala中,我们可以这么做
scala> def adder(m: Int, n: Int) = m + n
adder: (m: Int,n: Int)Int
scala> val add2 = adder(2, _:Int)
add2: (Int) => Int = <function1>
scala> add2(3)
res50: Int = 5
函数柯里化(Currying)
偏函数应用不是什么新东西,几乎所有编程语言中都可以简单地实现。但更简洁的实现是柯里化。
你可以这样定义柯里化 函数
scala> def multiply(m: Int)(n: Int): Int = m * n
multiply: (m: Int)(n: Int)Int
也可以对一个已有的函数进行转换。例如之前的adder函数
scala> (adder _).curried
res1: (Int) => (Int) => Int = <function1>
函数柯里化依赖匿名函数,把一个多参数的函数转化为多个单参数的函数连接在一起。这样一来,语意的表达就更加丰富而直观,函数组合也更加灵活。
类型推断
一个应用场景就是类型推断。Scala类库中的foldLeft
就是这样一个例子。
def foldLeft[B](z: B)(op: (B, A) => B): B
List("").foldLeft(0)(_ + _.length)
如果使用普通的多参数函数定义
def foldLeft[B](z: B, op: (B, A) => B): B
那么,你在使用时就必须显示地表明类型。
List("").foldLeft(0, (b: Int, a: String) => a + b.length)
List("").foldLeft[Int](0, _ + _.length)
简化API
另一个currying的应用是简化API。在下面的例子中,你可以使用大括号来传递body
,使得API调用层次分明。
def loop[A](n: Int)(body: => A): Unit = (0 until n) foreach (n => body)
loop(2) {
println("hello!")
}
多阶段计算
如果你的多参数函数的计算实际上是分步骤的,某个步骤只依赖某个参数,比如下面的例子。那么柯里化会更加简单。
def v(t: Double, k: Double): Double = {
// 只依赖于t
val ft = f(t)
g(ft, k)
}
v(1, 1); v(1, 2);
相关推荐
Scala编程综合进阶向导有33章。本书介绍了一种新的编程语言,它把面向对象和函数式编程概念有机地结合为整体,从而形成一种完整统一、语义丰富的新思维体系。
练习题-Scala函数式编程 函数式编程思想进阶 × scala-谜题 巩固基础 × scalatest 类库 类库扩展 × scala-json 操作(json4s) 类库扩展 √ shapeless 泛型编程库 类库扩展 × scala-app-cats cats 库相关操作 ...
本书由Scala之父作序推荐,深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书示例丰富,是...
· Scala基础入门 · 函数式编程 · 数据结构 · 面向对象编程 · 模式匹配 · 高阶函数 · 特质 · 注解&类型参数 · 隐式转换 · 高级类型 · 案例实操 Spark Core · 安装部署 · RDD概述 · 编程...
支持面向对象和函数式编程 能够通过调用C/C++代码扩展功能 代码规范程度高,可读性强 目前几个比较流行的领域,Python都有用武之地。 云基础设施 - Python / Java / Go DevOps - Python / Shell / Ruby / Go 网络...
1,基础教程1.1,centos相关1.2,maven相关2,大数据教程2.1,hdfs教程2.1,mapreduce教程3,剩余编写HDFS入门,深入,Shell访问,Java API操作MapReduce入门,深入,编程基础,编程进阶,实战分析和训练Yarn入门,...
Spark-Core文档是本人经三年总结笔记汇总而来,对于自我学习Spark核心基础知识非常方便,资料中例举完善,内容丰富。具体目录如下: 目录 第一章 Spark简介与计算模型 3 1 What is Spark 3 2 Spark简介 3 3 Spark...
第14章 Scala函数式编程语言 第15章 spark 计算框架 第16章 sparkstreaming开发 第17章 深入浅出Kafka 第18章 spark源码(点播) 第19章 Spark-MLlib(点播) 第20章 spark_graphx课程(点播) 第21章 智慧出行 第22...
Scala入门、函数、类、对象、特征、模式匹配、常用类和方法、异常处理、编程实战 Kafka入门、原理剖解、删除数据、消费数据、Shell访问和Java API访问 SparkCore技术原理、b编程模型、检查点、广播和累加器 sparkSQL...
大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化...
大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化...
10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22.Zookeeper 23....
10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22.Zookeeper 23....
10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22.Zookeeper 23....
10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22.Zookeeper 23....
大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化...
大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化...
大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化...
大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化...