`

scala学习笔记(十):本地函数、偏函数、部分应用函数

 
阅读更多

     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 学习笔记 方法 函数 类 对象 特质 推断 注解 编译 隐式转换 尾递归 元组 列表

    scala.rar学习笔记和心得

    Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Scala 源代码被编译成Java字节码,所以它可以运行于...

    scala学习资料

    Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。

    scala.rar基础知识,笔记很好的详细

    Scala学习资源Scala编程语言抓住了很多开发者的眼球。如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式编程和函数式编程风格。Christopher Diggins认为: 不太久...

    utility_Scala:Scala编程语言基本和函数式编程(fp)和Spark Scala基本演示| #SE

    -Scala学习注意事项 主要档案 适用于实用程序的Scala脚本 -Scala spark基本演示 Scala基本-变量,数据结构 -Scala基本数据结构: array, list, tuple ,应用function, lambda带有它们的function, lambda基本。 和...

    Scala学习笔记1——从文件读取文本行

    刚接触Scala,所以并不是很习惯这种函数式编程风格,就从现在的第一篇笔记开始记录这个学习过程啦!笔记来源于《Scala编程》的学习。 从文本读取文本行 初步目标: 构建一个脚本从文本读取文本行,并将它们打印出来...

    scala-advanced:Scala先进

    scala 入门进阶、常用类库学习 项目结构 模块说明 模块 说明 目的 完成 语言核心特性、特性深度分析示例、常用函数 入门 √ 练习题-std-lib 巩固基础 √ 练习题-Scala函数式编程 函数式编程思想进阶 × scala-谜题 ...

    Scala详细总结(精辟版++)

    这是我学习scala时做的笔记,应该比较全面,对于初学scala足够了。文档排版整齐、方便阅读。 另外,我在百度文库也上传过一份,不过csdn上的版本是最新的。希望可以帮助到你。 --------- 目录 --------- 概述 1 ...

    Scala、Groovy++、Stackless Python、Erlang 学习笔记及分享

    NULL 博文链接:https://xiajs.iteye.com/blog/1871551

    关于Scala那些事儿

    这是一份总结的学习笔记 路漫漫其修远兮,吾将上下而求索 可阅读可评论可分享可转载,希望向优秀的人学习 前言 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种...

    Spark-Core学习知识笔记整理

    Spark-Core文档是本人经三年总结笔记汇总而来,对于自我学习Spark核心基础知识非常方便,资料中例举完善,内容丰富。具体目录如下: 目录 第一章 Spark简介与计算模型 3 1 What is Spark 3 2 Spark简介 3 3 Spark...

    97 Things Every Programmer Should Know 等 24 本书

    AngularJS学习笔记(checkcheckzz).epub Everything curl.epub F# for Fun and Profit eBook.epub Gradle 实战.epub iOS的函数响应型编程.epub JVM必知必会.epub Kubernetes 指南.epub LeetBook(LeetCode详解)....

    matlab跑c代码-Nevertiree_ToolBox:我的零件百宝箱

    本项目记录从本科开始的各种代码片段和学习笔记,以便再实际应用中Swift造出轮子。本项目涵盖领域如下 收录的编程语言包括跑的比谁都快的C/C++,面向对象的Java和Python,函数式编程家族的Haskell、Scala和Lisp,...

    matlab如何敲代码-Advanced-Python:像专业人士一样编码!

    matlab如何敲代码 所以你想成为一个百万富翁很棒的Python程序员?...函数式编程:Haskell,Scala,Clojure,F# 面向并行/数组处理的高性能:MATLAB / Octave,Julia,R,Rust,Go 异步/事件驱动的编

Global site tag (gtag.js) - Google Analytics