`
bit1129
  • 浏览: 1067632 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala七】Scala核心一:函数

 
阅读更多

1. 如果函数体只有一行代码,则可以不用写{},比如

def print(x: Int) = println(x)

一行上的多条语句用分号隔开,则只有第一句属于方法体,例如

 

def printWithValue(x: Int) : String= println(x); "ABC"

 

上面的代码报错,因为,printWithValue的方法体只有一句代码println(x),而它结果值是Unit,因此指定printWithValue返回String,出现类型返回错误。如果将两条语句包在一起,则正确

 

def printWithValue(x: Int) : String= {println(x); "ABC"}

 

 

 

 

 

2.无参函数,在调用时,不需要写(),直接写函数名即是方法调用。则代码中写print和print()都是方法调用

 

def print() = println(100)

 

3. 如果方法明确的指定了返回值的类型,则必须在返回值类型后加等于号,否则可以不加也可以加

 

  def noReturn() = {
    println("100");
  }

 也可以写成:

  def noReturn() {
    println("100");
  }

 

如下写法是不正确的:

 

    def noReturn():Unit {
      println("100");
    }

 必须写成:

    def noReturn() :Unit = {
      println("100");
    }

 因此,好的习惯是不论有无返回值,都加=

 

4.默认函数值,必须出现在最后,即带有默认值的参数后不能再有不带默认值的参数了

 

  def add(a: Int, b: Int = 20, c: Int = 30): Int = {
    a + b + c
  }

 

下面的写法,不报错,但是调用add(100)则报错

  def add(a: Int = 20, b: Int, c: Int = 30): Int = {
    a + b + c
  }

 

5. 变长参数,使用T*表示

 

  def sum(elems: Int*) : Int = {
    var sum = 0;
    elems.foreach(elem => sum += elem)
    sum
  }

 下面的写法则报错:

 

  def sum(elems: Int*) : Int = {
    var sum = 0;
    elems.foreach(_ => sum += _)
    sum
  }

 提示,sum += _不正确

 

Error:(61, 31) missing parameter type for expanded function ((x$2) => sum.<$plus$eq: error>(x$2))
    elems.foreach(_ => sum += _)
                              ^

 

如下写法是正确的,使用_指代循环的变量,简单的写法:

 

  def sum(elems: Int*) : Int = {
    var sum = 0;
    elems.foreach(sum += _)
    sum
  }

 

 

6. 方法抛异常,无需检查Checked Exception

  def exceptionProcessing() {
    try {
      throw new Exception("error");
    } catch {
      case e:IllegalArgumentException => println("IAE" + e.getMessage)
      case e: NullPointerException => println("NPE" + e.getMessage);
      case e: Exception => throw e //如果是Exception,则重新抛出
    }
  }

 

7. 带有多个(参数)的函数,柯力化

 

  def addXY(x:Int)(y:Int) : Int= {
    x + y
  }

 通过如下调用:addXY(1)(2)

 

8. 函数赋值

 

  def addXY(x:Int)(y:Int) : Int= {
    x + y
  }

 

    val copyOfAddXY = addXY(1)(_)
    println(copyOfAddXY(3))

 结果是4,这表示部分应用函数,如果不加(_)则是不正确的

 

9,部分应用函数:

  def substract(a: Int, b: Int, c: Int): Int = {
    a + b - c
  }

 则如下的第一个赋值是正确的,剩下的两个都不正确,

 

    var func1 = substract(_,_,_) ///正确
    println(func1(1,5,3))
    func1 = substract(2,_,_) //提示:Wrong number of parameters, expected
    println(func1(8,3));
    func1 = substract(3,_,9)//提示:Wrong number of parameters, expected
    println(func1(100))

 

10. 闭包

  def closure(x :Int) :Int => Int ={
      def sum(y:Int) :Int = {
        x + y //x is not in the scoped of the
      }
    sum
  }

 

调用closure(10)(100),注意Int=>Int是函数sum的类型,即输入为Int,输出也为Int

 

11.

 

  def myValue = {
    val a = 10
    a + 10
  }
 调用时,println(myValue)正确,println(myValue())则报错,原因是myValue不是函数,因为定义时没有加括号def myValue而不是def myValue(),这里的myValue是一个值,块表达式。那么它的效果跟如下定义一个使用块表达式表示的变量是一样的

 

 

  val myValue = {
    val a = 10
    a + 10
  }
 

 

12

  def myFunc() = {
    val a = 10;
    a + 10
  }

 println(myFunc())为什么打印20,因为myFunc没有指明返回值的类型,那就默认是Unit?这个理解是错误的,Scala的函数定义也可以自动推导函数的返回类型,一个函数是否有返回值,看参数列表()和方法体{}之间是否有等号,有等号,则把

最后一个语句的返回值作为函数的返回值(尽管没有显式指定函数的返回值),如果没有使用等号,那么函数一律返回Unit

 

 

分享到:
评论

相关推荐

    Scala函数式编程

    《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...

    Scala编程详解 第5讲-Scala编程详解:函数入门 共5页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala编程详解 第16讲-Scala编程详解:函数式编程 共14页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala编程详解 第17讲-Scala编程详解:函数式编程之集合操作 共9页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala编程详解 第7讲-Scala编程详解:函数入门之变长参数 共4页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    scala-2.12.6.tgz

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念,设计目标是提供一种静态类型系统,能够防止程序在运行时出现错误。Scala-2.12.6.tgz是一个针对该语言的最新版本安装包,用于在各种操作系统...

    Scala函数式编程.pdf

    函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。

    Scala编程详解 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Scala是一种静态类型的函数式编程语言,而Spark是一个分布式计算框架,尤其适合于大数据处理和分析。本教程将深入探讨这两者如何结合,实现高效的大数据分析、数据流处理以及机器学习任务。 首先,让我们来理解...

    尚硅谷_韩顺平_Scala语言核心编程_PDF密码解除1

    Scala是一种静态类型的编程语言,它融合了面向对象和函数式编程的概念,设计目标是提供一种简洁、高性能的编程体验。以下是对标题和描述中涉及的知识点的详细说明: 1. **学习Scala的原因**: Scala的出现主要是...

    第5讲-Scala编程详解:函数入门.rar

    例如,计算阶乘的递归函数: ```scala def factorial(n: Int): Int = { if (n == 0) 1 // 终止条件 else n * factorial(n - 1) // 递归调用 } println(factorial(5)) // 输出120 ``` 这里,当`n`等于0时,函数...

    Scala语法简明教程

    - **面向对象+函数式编程**:Scala融合了面向对象编程和函数式编程的特性,支持类、对象和继承的同时也支持高阶函数、不可变性等函数式编程的核心概念。 - **分布式运行**:Scala设计之初就考虑到了并行和分布式...

    spark源码之scala基础语法demo

    scala是一种基于JVM的面向对象的函数编程,scala编程相对于java而言代码整洁、开发效率更高。 其中scala优点主要有: 1:面向对象,可以定义class,通过new调用实例对象使用。 2:兼容java,在scala中可以直接调用...

    Scala脚本:函数式编程的实用指南

    Scala,作为一种将面向对象编程和函数式编程完美结合的语言,提供了强大的函数式编程特性。Scala的函数式编程(FP)不仅包括高阶函数、匿名函数、递归和模式匹配等,还提供了不可变数据结构和纯函数等核心概念。本文...

    Scala编程实战

    Scala是一种多范式编程语言,它结合了面向对象编程和函数式编程的概念,设计目标是提供一种高效、简洁且可扩展的编程环境。本资源是一本高清版的Scala编程实战教程,适合对Scala有浓厚兴趣或者希望提升Scala技能的...

    scala sdk scala-2.12.3

    Scala SDK,全称为Scala Software Development Kit,是用于开发Scala应用程序的核心工具集。Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态...

Global site tag (gtag.js) - Google Analytics