Scala中的函数是Java中完全没有的概念。因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只有方法的概念。
而Scala是一门既面向对象,又面向过程的语言。因此在Scala中有非常好的面向对象的特性,可以使用Scala来基于面向对象的思想开发大型复杂的系统和工程;而且Scala也面向过程,因此Scala中有函数的概念。在Scala中,函数与类、对象等一样,都是一等公民。Scala中的函数可以独立存在,不需要依赖任何类和对象。
1、本地函数,其实本地函数就是定义在函数内部的函数
def processData(fileName:String,width:Int){ //定义本地函数-("内部/私有函数...") def processLine(line:String){ if(line.length>width) println(fileName+":"+line) } val source=Source.fromFile(fileName) for(line<- source.getLines()) processLine(line)//调用本地函数 }
2、偏函数 PartialFunction 偏函数是个数学概念, 偏函数不是"函数"的一种, 而是一个跟函数平行的概念,它是指定义域X中可能存在某些值在值域Y中没有对应的值,
/** PartialFunction特质规定了两个要实现的方法:apply和isDefinedAt * PartialFunction[]中第一个泛型表示传递进行参数的类型,第一个泛型表示返回值的类型 * 因为case语句只能声明一个变量,那么偏函数受限于此,也只能有一个参数 */ val par = new PartialFunction[Any,Int] { //isDefinedAt用来告知调用方这个偏函数接受参数的范围 override def isDefinedAt(x: Any): Boolean = if(x.isInstanceOf[Int]) true else false //apply方法用来描述对已接受的值如何处理 override def apply(v1: Any): Int = v1.asInstanceOf[Int] + 1 } List(1,3,8,"two") collect par foreach(println)
但是这样使用起来真得非常笨拙,其实还有一种方式来定义偏函数,那就是模式匹配
val spar:PartialFunction[Any,Int] = {case i:Int => i + 1} List(1,3,8,"two") collect spar foreach(println) 输出: 2 4 9
但是我需要分别匹配2个怎么办?orElse
val num:PartialFunction[Any,Int] = {case x:Int => x * 3} val str:PartialFunction[Any,String] = {case x => x + " is String"} println("PartialFunction orElse") List(1,2,3,"one") collect (num orElse str) foreach println 输出: 3 6 9 one is String
case 有时候是可以被编译成匿名函数,但是如果List里面包含的元素和case里面不匹配的话就会出错
/** * 一个case语句就是一个独立的匿名函数 * case i:Int => i +3 等价 (i:Int) =>i +3 */ List(1,2,3) map {case i:Int => i +3} foreach(println) //collect 接受的是PartialFunction偏函数 List(1,2,3) collect {case i:Int => i +3} foreach(println) //map接受的是一个函数 所以到了one元素的时候会报类型错误 //List(1,2,3,"one") map {case i:Int => i +3} foreach(println) val num:PartialFunction[Any,Int] = {case x:Int => x * 3} val str:PartialFunction[Any,String] = {case x => x + " is String"} println("PartialFunction orElse") //只要保证list元素能在偏函数中匹配完就不会报错 List(1,2,3,"one") map (num orElse str) foreach println
3、部分应用函数 Partial Applied Function 是指一个函数有N个参数, 而我们为其提供少于N个参数, 那就得到了一个部分应用函数
def sum(a:Int,b:Int) = a + b ; /** * p_sum: Int => Int = <function1> * Function类型有多个版本,Function0表示无参数函数,Function1表示只有一个参数的函数 * PartialFunction还是Function1d的子类 */ def p_sum = sum(1, _:Int) println(p_sum(4)) 输出: 5
相关推荐
scala 学习笔记 方法 函数 类 对象 特质 推断 注解 编译 隐式转换 尾递归 元组 列表
Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Scala 源代码被编译成Java字节码,所以它可以运行于...
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
Scala学习资源Scala编程语言抓住了很多开发者的眼球。如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式编程和函数式编程风格。Christopher Diggins认为: 不太久...
-Scala学习注意事项 主要档案 适用于实用程序的Scala脚本 -Scala spark基本演示 Scala基本-变量,数据结构 -Scala基本数据结构: array, list, tuple ,应用function, lambda带有它们的function, lambda基本。 和...
刚接触Scala,所以并不是很习惯这种函数式编程风格,就从现在的第一篇笔记开始记录这个学习过程啦!笔记来源于《Scala编程》的学习。 从文本读取文本行 初步目标: 构建一个脚本从文本读取文本行,并将它们打印出来...
scala 入门进阶、常用类库学习 项目结构 模块说明 模块 说明 目的 完成 语言核心特性、特性深度分析示例、常用函数 入门 √ 练习题-std-lib 巩固基础 √ 练习题-Scala函数式编程 函数式编程思想进阶 × scala-谜题 ...
这是我学习scala时做的笔记,应该比较全面,对于初学scala足够了。文档排版整齐、方便阅读。 另外,我在百度文库也上传过一份,不过csdn上的版本是最新的。希望可以帮助到你。 --------- 目录 --------- 概述 1 ...
NULL 博文链接:https://xiajs.iteye.com/blog/1871551
这是一份总结的学习笔记 路漫漫其修远兮,吾将上下而求索 可阅读可评论可分享可转载,希望向优秀的人学习 前言 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种...
Spark-Core文档是本人经三年总结笔记汇总而来,对于自我学习Spark核心基础知识非常方便,资料中例举完善,内容丰富。具体目录如下: 目录 第一章 Spark简介与计算模型 3 1 What is Spark 3 2 Spark简介 3 3 Spark...
AngularJS学习笔记(checkcheckzz).epub Everything curl.epub F# for Fun and Profit eBook.epub Gradle 实战.epub iOS的函数响应型编程.epub JVM必知必会.epub Kubernetes 指南.epub LeetBook(LeetCode详解)....
本项目记录从本科开始的各种代码片段和学习笔记,以便再实际应用中Swift造出轮子。本项目涵盖领域如下 收录的编程语言包括跑的比谁都快的C/C++,面向对象的Java和Python,函数式编程家族的Haskell、Scala和Lisp,...
matlab如何敲代码 所以你想成为一个百万富翁很棒的Python程序员?...函数式编程:Haskell,Scala,Clojure,F# 面向并行/数组处理的高性能:MATLAB / Octave,Julia,R,Rust,Go 异步/事件驱动的编