1. 几个概念说明

  • 在Scala中,方法与函数几乎可以等同(定义 使用 运行机制),只是函数的使用方法更加灵活多样
  • 函数式编程是从编程方式的角度来谈的。函数式编程把函数当成一等公民,充分利用函数、支持函数的多种使用方式(调用)。既可以作为函数的参数使用,也可以将函数赋值给一个变量;此外函数的创建不用依赖类或者对象,而在Java中,函数的创建需要依赖类/抽象类或者接口
package com.lineshen.chapter5object method2FunctionDemo {def main(args: Array[String]): Unit = {val dog = new Dogval res1 = dog.sum(10, 20)println(res1)//方法转成函数val func = dog.sum _val res2 = func(20, 30)println(res2)//函数编程val func2 = (n1: Int, n2: Int) => n1 + n2val res3 = func2(30,40)println(res3)}
}class Dog {def sum(n1: Int, n2: Int): Int = {n1 + n2}
}>>30
>>50
>>70

函数的基本约定:

def 函数名([参数名:参数类型], ... ) [[:返回类型]] = {函数体return 返回值
}
  • 函数申明关键字是 def
  • [参数:参数类型] 表示函数的输入,可以没有,如果有多个,用逗号分割
  • 函数中的语句是为了实现某一功能的代码块
  • 函数可以有返回值,也可以没有;最好使用=,直接进行返回类型的推导
  • 如果没有 reture ,默认以执行到最后一行的结果作为返回值
package com.lineshen.chapter5object FunDemo1 {def main(args: Array[String]): Unit = {val n1 = 1val n2 = 2println("sum="+getSum(n1,n2,"+"))}def getSum(n1: Int, n2: Int,opt: String) = {if (opt == "+"){n1 + n2} else if (opt == "-"){n1 - n2} else {null}}
}

本例中,n1+n2 / n1-n2 与 null的类型无法统一,就可以直接使用=进行返回类型的推导。

2. 函数递归

函数递归需要遵守的重要规则:

  • 程序执行函数时,就会创建一个新的受保护的独立空间(新函数栈)
  • 函数的局部变量是相互独立的,不会相互影响
  • 递归必须向逼近递归的条件逼近,否则就是无限递归

3. 函数的注意事项以及使用细节

  • 如果函数没有形参,那么函数调用过程中,不用写()
  • 形参列表和返回值列表的数据类型可以是值类型,也可以是引用类型
package com.lineshen.chapter5object funcDetails {def main(args: Array[String]): Unit = {val tiger0 = new tigerprintln(tiger0.name)val tiger1 = test(100, tiger0)println(tiger1.name)}def test(n1:Int, tiger0:tiger): tiger= {println("n1="+ n1)tiger0.name = "jack"tiger0}
}class tiger{var name = "lineshen"
}

输出结果: lineshen 100 jack

  • Scala中的函数可以根据函数体最后一行代码自动推断函数的返回值类型,该种情况下,return也可以不用写
  • 因为Scala可以自动推断返回值类型,因此,直接使用=就好了,或者用[:Any=]
  • 一旦使用return,就必须指定返回值类型 [:返回值类型];如果不指定,就是表示该函数没有任何返回值
  • 如果函数返回值制定了Unit,那么return无效
  • Scala支持高级嵌套,如类中可以再一次声明类;方法中可以继续定义方法
package com.lineshen.chapter5object dupFunc {def main(args: Array[String]): Unit = {def sayOK(): Unit = { // private final sayOK$1println("say ok")def sayOK(): Unit = { // private final sayOK$2println("say ok, say ok")}}}
}
  • 形参可以进行初始化,默认调用;实参会覆盖形参;可以指定覆盖特定的形式参数默认值【带名参数】
  • Scala中的形参默认为是val,函数体中不允许去修改
  • 递归无法进行类型自动推导,必须指定返回类型
  • 支持可变形参,用for进行解析

4. 惰性函数

惰性计算(尽可能延迟表达式求值)是许多函数式编程语言的特性。惰性集合在需要时提供其元素,无需预先计算它们,这带来了一些好处。首先,可以将耗时的计算推迟到绝对需要的时候。其次,可以创造无限个集合,只要它们继续收到请求,就会继续提供元素。函数的惰性使用能够得到更高效的代码。Java并没有为惰性提供原生支持, Scala提供了,使用很方便。

object layDemo {def main(args: Array[String]): Unit = {lazy val res = sum(10, 20)println("-------------")println("-------------")println("-------------")println(res)}def sum(n1: Int, n2: Int): Int = {n1 + n2}

输出结果(lazy函数只能用val进行修饰,为了保证线程安全):

-------------
-------------
-------------
30

5. 异常处理

  • 抛出异常

Scala 抛出异常的方法和 Java一样,使用 throw 方法,例如,抛出一个新的参数异常:

throw new IllegalArgumentException
  • 捕捉异常

异常捕捉的机制与其他语言中一样,如果有异常发生,catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。

捕捉异常的catch子句,语法与其他语言中不太一样(java使用了try-catch-catch-finnaly 无论有没有异常 finally代码块都会执行,一般用来释放资源)。在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句,如下例所示:

import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOExceptionobject exceptionDemo {def main(args: Array[String]) {try {val f = new FileReader("input.txt")} catch {case ex: FileNotFoundException => {println("Missing file exception")}case ex: IOException => {println("IO Exception")}}finally{println("Programming has run")}}
}

输出结果:

Missing file exception
Programming has run   【实际应用中,一般用于释放资源】

[scala-spark]4. 函数式编程相关推荐

  1. Scala 中的函数式编程基础(一)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  2. Scala 中的函数式编程基础

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  3. Scala进阶_函数式编程(过滤丶排序丶分组丶聚合)

    过滤 | filter 过滤符合一定条件的元素 定义 方法签名 def filter(p: (A) ⇒ Boolean): TraversableOnce[A] 方法解析 filter方法 API 说 ...

  4. Scala中的函数式编程与面向对象编程知识点复习整理(二)——面向对象编程

    面向对象基础 概述 Scala是一门完全面向对象的语言,摒弃了Java中很多不是面向对象的语法,虽然如此,但其面向对象思想和Java的面向对象思想还是一致的. package 在java中     作 ...

  5. 【中英双语】高级Scala函数式编程

    [中英双语]高级Scala函数式编程 成为顶级 Scala 程序员,这样您就可以使用 Spark.Akka.Cats 或任何 Scala 工具!此教程共13.5小时,中英双语字幕,画质清晰无水印,源码 ...

  6. scala函数式编程(二) scala基础语法介绍

    上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容. 这里会先重点介绍scala的一些语法.当然,这里是假设你有一些ja ...

  7. spark编程基础--2.4函数式编程基础

    foreach遍历操作 映射操作map,flatmap 过滤操作filter 规约操作 reduce,fold方法 拆分操作partition,groupedBy,grouped,sliding Sc ...

  8. 《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

    本节书摘来自异步社区<深入理解Scala>一书中的第1章,第1.2节Scala的当函数式编程遇见面向对象,作者[美]Josh Suereth,更多章节内容可以访问云栖社区"异步社 ...

  9. Java程序员必备秘籍 Scala与Clojure函数式编程语言

    编程世界就好比江湖,各种技术与思想有如各种内外家功夫在历史的舞台上纷呈登场,各领风骚.如今,自C.C++传承而来的以Java为代表的命令式语言一派可谓如日中天.门徒万千.多年来,这几门语言一直占据着T ...

  10. 响应式编程 函数式编程_函数式编程简介

    响应式编程 函数式编程 根据您要求的对象, 函数式编程 (FP)是一种应运而生的开明编程方法,或者是一种在实践中几乎没有实际好处的过于学术化的方法. 在本文中,我将解释什么是函数式编程,探讨其好处,并 ...

最新文章

  1. TIOBE 8 月编程语言:C、Java 差距拉大,R 语言盛行
  2. AutoML自定义搜索网络类(如何在一个大的网络中搜索一个网络)
  3. 编程之美3.2 电话号码对应英语字母
  4. android loadlibrary 更改libPath 路径,指定路径加载.so
  5. R语言多层桑基图_桑基图的绘制核心微生物组分类学及丰度展示
  6. textureview 旋转90度后平铺_C++初级编程NOIP题:11H1537: 图像旋转
  7. gcc在64位系统上一个史诗级WARNING
  8. springmvc 同时匹配.do,.action
  9. CFS任务的负载均衡(框架篇)
  10. 东南卫视肌肤食品微商套路解析
  11. 如何获取网络标准时间
  12. python自动轨迹绘制七边形_断面法计算土方步骤及其技巧
  13. 视觉里程计 特征点法
  14. html适配手机 响应式,移动端适配(响应式)
  15. SparkOutOfMemoryError: Unable to acquire 65536 bytes of memory, got 0
  16. debussy和modelsim联合仿真配置
  17. 内核与驱动文件的version magic匹配问题
  18. 帝国cms插件|支持7.5/7.2 移动同步生成插件|帝国多端访问必备插件
  19. 并发与并行的区别(超级通俗易懂)
  20. 湖北师范大学计算机考研资料汇总

热门文章

  1. 深入浅出Mybatis系列(一)---Mybatis入门
  2. 看文艺青年怎么玩微信客户端
  3. 标题:ASP.NET几种进行性能优化的方法及注意问题
  4. 《深入C++对象模型》笔记
  5. 跨语言平台的RSA加密、解密、签名、验证算法的实现
  6. poj 1696(极角排序)
  7. nyist-组队赛(七)
  8. NYOJ 665 台球碰撞
  9. ubuntu16.04设置ssh免密码登录
  10. 【Python+selenium Wendriver API】之鼠标悬停事件