1、面相对象编程和函数式编程

2、函数和方法的区别

scala可以在任何的语法结构中声明任何的语法;

scala中函数可以嵌套定义;

scala中如果main内部的函数 和 main外部的函数名称、参数、返回值均一样时,

此时main内部的函数优先被调用;

3、函数的参数

(1 ) 可变参数:当前参数的个数可以不确定;

(2) 如果参数列表中存在多个参数,那么可变参数一般放置在最后;

(3) 参数默认值,一般将有默认值的参数放在参数列表的后面;

被指定默认值的参数在调用函数时可以不传该参数;

(4) 带名参数;

4、函数至简原则(能省则省)

(1)  return可以省略,scala会使用函数体的最后一行代码作为返回值;

(2) 如果函数体只有一行代码,花括号可以省略;

(3) 返回值类型如果能够推断出来,那么:和 返回值类型 可以一起省略;

例如:def function3(name: String) = name

(4) 如果有return,则返回值类型不能省略,必须指定;

(5) 如果函数明确声明Unit,那么函数体中即使使用return关键字,也不起作用;

(6) scala中如果期望是无返回值类型,可以省略等号;

(7) 如果函数无参,但是声明了参数列表,那么调用时,小括号可加可不加;

(8) 如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略;

(9) 如果不关心当前函数的名称,只关心逻辑处理,那么函数名(def)可以省略;

注意:def省略后的函数被成为 匿名函数,lambda表达式

5、匿名函数

(1 ) 匿名函数的调用: 将整个函数的值赋给变量;

(2) 匿名函数的简化原则

a、参数的类型可以省略,会根据形参进行自动的推导;

b、类型省略之后,发现只有一个参数,则圆括号可以省略;

其他情况:没有参数或参数超过1的永远不能省略圆括号;

c、如果匿名函数的函数体只有一行,则大括号也可以省略;

d、如果参数只出现一次,则参数省略且后面参数可以用_替代;

e、如果可以推断出,当前传入的println是一个函数体,而不是调用语句,可以直接省略下划线;

(3) 匿名函数的应用

a、应用1:以函数作为参数输入:此时的函数可以称为是一种操作;

println(dualEval( _ + _ , 23 , 44 ))      //可以再进一步进行简化

b、应用2:函数可以作为值传递

c、应用3:函数可以作为函数返回值返回

6、scala递归实现阶乘

缺点:耗费很多栈空间资源,可能会出现栈内存溢出。

// 计算f5的数据时,f(5)/f(4)/f(3)...f(1)的数据均存储在栈针中。

 7、控制抽象--针对函数参数

值调用:传值参数

名调用:传名参数

8、闭包和柯里化

(1)、闭包:如果一个函数访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,成为闭包。

         闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。

目的:把内层函数所依赖的变量给保存起来,延长变量的生命周期,保证我们调用时能找到。

  实现方式:外层函数 要以内层函数作为返回值 来返回

(以一个内层函数作为返回值,来定义一个外层函数:内层函数用到了外层函数的变量/参数)

闭包实例

(2)、函数柯里化:把一个参数列表的多个参数,变成多个参数列表(更常用)。

注意:柯里化的底层一定是闭包;闭包并非要用柯里化去书写。

小扩展:

JVM中: 所有使用的对象 是存储在heap堆(堆本身线程是共享的)中,

所有的局部变量和操作数 存在stack栈(栈本身线程是独享的)中

scala之函数式编程的更多相关文章

  1. Scala:函数式编程之下划线underscore

    http://blog.csdn.net/pipisorry/article/details/52913548 python参考[python函数式编程:apply, map, lambda和偏函数] ...

  2. Scala函数式编程进阶

    package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

  3. Scala入门系列(九):函数式编程

    引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...

  4. Scala入门系列(十):函数式编程之集合操作

    1. Scala的集合体系结构 Scala中的集合体系主要包括(结构跟Java相似): Iterable(所有集合trait的根trait) Seq(Range.ArrayBuffer.List等) ...

  5. 5. Scala函数式编程的基础

    5.1 函数式编程内容及介绍顺序说明 5.1.1 函数式编程内容 -函数式编程基础 函数定义/声明 函数运行机制 递归(难点,[最短路径,邮差问题,迷宫问题,回溯]) 过程 惰性函数和异常 -函数式编 ...

  6. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  7. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

  8. (数据科学学习手札48)Scala中的函数式编程

    一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...

  9. 9、scala函数式编程-集合操作

    一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...

  10. 8、scala函数式编程

    一.函数式编程1 1.介绍 Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象, 而且只有方法的概念 ...

随机推荐

  1. PyTorch之初级使用

    使用流程①. 数据准备; ②. 模型确立; ③. 损失函数确立; ④. 优化器确立; ⑤. 模型训练及保存 模块介绍Part Ⅰ: 数据准备torch.utils.data.Dataset torch ...

  2. satpy 处理卫星 FY4A 数据

    读取数据并画图 import os import glob from datetime import datetime, timedelta from satpy.scene import Scene ...

  3. php实现无限极分类

    1.无限极分类 //处理父子级 private function getChildBak($data,$parent_id = 0){ $arr=array(); $i = 0; foreach($d ...

  4. H5云图后台读写CAD文件-在线CAD,网页CAD,网页浏览编辑CAD

    说明 后台提供MxFileConvert.exe程序,它可以将CAD图纸转换成前台能加载显示的格式,程序调用方法见: https://help.mxdraw.com/?pid=32中的"如何 ...

  5. boolean布尔型盲注

    mysql中limit的详细用法 1.用于强制返回指定的记录行数 在查询中,经常要返回前几条或者中间某几行数据时,用到limit 语法如下 select * from table_name limit ...

  6. 读后笔记 -- Python 全栈测试开发 Chapter8:接口测试

    8.1 接口测试 1. 市场分布 UI(web.app)自动化:10% 接口自动化:20% 单元测试:70% -- 测开 2. 接口类型: 1)结构划分:模块间(系统间)的接口称为内部接口:系统与第三 ...

  7. 实用的JavaScript技巧

    1.数组去重 let arr = [...new Set([1,2,3,2,1])]; //输出:[1, 2, 3] 2.删除数组中的虚值(undefined .null.NaN.0 .'' .fal ...

  8. Qt中跨进程Socket通信以及socket跨线程通信

    一 QTcpServer 创建流程 创建套接字服务器 QTcpServer 对象, 通过 QTcpServer 对象设置监听,即:QTcpServer::listen() 基于 QTcpServer: ...

  9. 阿里云ECS部署单机kafka 并对外提供服务(带认证)

    1. zk配置(单机) zoo.cfg tickTime=2000initLimit=10syncLimit=5dataLogDir=/data/zookeeper/log/dataDir=/data ...

  10. Win10应用商店经常遭遇打不开的情况,如错误代码0x80131500

    1.用"win + R"打开运行 2.输入 inetcpl.cpl 打开Internet属性(或从IE浏览器设置打开) 3 点击高级选项 4 找到并勾选 TLS 1.2,取消勾选T ...