`

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概述与特点 Scala是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala...

    scala学习笔记整理

    在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...

    Scala学习笔记

    ### Scala学习笔记关键知识点 ...以上内容涵盖了Scala学习笔记中的关键知识点,从并发编程到函数式编程的核心概念,再到Scala语言本身的一些特殊规则和特点,这些都是学习Scala时需要掌握的基础知识。

    读书笔记:《scala函数式编程》书本学习代码.zip

    读书笔记:《scala函数式编程》书本学习代码

    scala学习资料

    - 函数和高阶函数:学习如何定义和使用函数,以及如何使用高阶函数进行函数式编程。 - 集合:深入研究Scala的集合API,掌握其使用技巧和优化策略。 - 特性与模式匹配:学习如何使用特性来解决多重继承问题,以及如何...

    读书笔记:基于scala语法学习函数式编程方法.zip

    读书笔记:基于scala语法学习函数式编程方法

    读书笔记:函数式编程 scala,java8,groovy 学习.zip

    读书笔记:函数式编程 scala,java8,groovy 学习

    读书笔记:scala的纯函数式编程数据结构学习.zip

    读书笔记:scala的纯函数式编程数据结构学习

    scala讲解笔记 入门及进阶 PDF文档1-5

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和高性能应用开发。...每个文档都配有实例和注释,便于理解和实践,是Scala学习者宝贵的资源。

    Scala-学习资料-mht.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发、大数据分析以及构建高性能系统时表现卓越。在"Scala-学习资料-mht.rar"这个压缩包中,包含了关于Scala的学习资料,格式为...

    scala学习笔记

    以上内容覆盖了 Scala 编程语言的核心知识点,从基本语法到高级特性,为初学者提供了一个全面的学习指南。Scala 是一门功能强大且灵活的语言,适合于构建大型的、复杂的软件系统。希望这些知识点能够帮助读者更好地...

    读书笔记:《Scala与Clojure函数式编程模式Java虚拟机高效编程》学习代码记录.zip

    读书笔记:《Scala与Clojure函数式编程模式Java虚拟机高效编程》学习代码记录

    scala-learn:scala学习笔记

    本教程“scala-learn:scala学习笔记”旨在帮助初学者深入理解Scala的基础知识,同时也为有经验的程序员提供了一个复习和提升的平台。 1. **基础语法与数据类型** Scala的基础语法简洁而强大,包括变量声明(val和...

    scala的操作笔记

    ### Scala的操作笔记 #### 一、课程目标与学习路径 ...通过本课程的学习,不仅可以掌握Scala的基础知识,还能深入了解Scala在实际项目中的应用技巧,为进一步探索Spark等大数据处理框架打下坚实的基础。

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

    1. 学习曲线陡峭:Scala 语言的学习曲线陡峭,需要一定的编程基础和函数式编程的知识。 2. 与 Java 语言的集成:Scala 语言与 Java 语言的集成需要一定的经验和实践。 3. 工具支持不够完善:Scala 语言的工具支持...

    scala.rar学习笔记和心得

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

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

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

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

    Scala初学者入门课程笔记

    Scala 初学者入门课程笔记 Scala 是一种多范式编程语言,支持面向对象编程、函数式编程和逻辑编程。...Scala 是一种功能强大且灵活的编程语言,掌握 Scala 基础语法和函数式编程是学习 Scala 的基础。

Global site tag (gtag.js) - Google Analytics