目录

函数 重点掌握

定义函数

方法和函数的区别

方法转换为函数

完全体函数


函数 重点掌握

scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数

函数和我们的对象一样, 在Scala中都是属于一等公民

定义函数

简便语法

val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体

[!TIP]

  • 函数是一个对象(变量)
  • 类似于方法,函数也有输入参数和返回值
  • 函数定义不需要使用def定义
  • 无需指定返回值类型

示例

定义一个两个数值相加的函数

调用该函数

参考代码

scala> val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>scala> add(1,2)
res3: Int = 3

方法和函数的区别

  • 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中. 但是函数本身就是一个对象
  • 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中
  • 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法。方法则没有

通俗来说, 从定义的方式就可以看出方法和函数的区别.

一般我们使用def定义的为方法.

而通过val 或者var 定义一个对象来接收的, 一般就是函数

因为方法无法赋值给对象, 但是函数定义的时候, 就是直接赋值给了对象的

示例

方法无法赋值给变量

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Intscala> val a = add
<console>:12: error: missing argument list for method add
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.val a = add

方法转换为函数

  • 有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数
  • 使用_即可将方法转换为函数

示例

定义一个方法用来进行两个数相加

将该方法转换为一个函数,赋值给变量

参考代码

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Intscala> val a = add _
a: (Int, Int) => Int = <function2>

大家不用过多去思考为何加了一个 _ 就能转换成函数, 这里没有什么特殊的意思, 就是语法要求而已.

完全体函数

前面写的函数 实际上是一种省略了返回值的写法, 完全体如下

val func: (Int, Int) => Int = (x, y) => x + y

其中

  • 前面的(Int, Int) => Int 是对象func(也就是这个函数)的类型, 类型是一个函数, 函数的内容格式是 两个int参数输入, 返回一个int输出
  • 后面的(x, y) = > x + y 就是定义形参, 给形参命名, 同时写上函数体

一般我们不写完全体, 简略体就够了

容易混淆的错误写法

scala> val addFunc: Int = (x:Int, y:Int) => x + y
<console>:11: error: type mismatch;found   : (Int, Int) => Intrequired: Intval addFunc: Int = (x:Int, y:Int) => x + y

对函数addFunc的类型定义错误

addFunc是一个函数, 函数的类型必须是能看出 什么输入 + 得到什么输出

也就是这里addFunc的类型应该是 (Int, Int) => Int 也就是, 两个Int输入参数, 得到一个Int输出返回.

2021年大数据常用语言Scala(十三):基础语法学习 函数 重点掌握相关推荐

  1. 2021年大数据常用语言Scala(四):基础语法学习 声明变量

    目录 声明变量 语法格式 在解释器中定义一个变量 val和var变量 使用类型推断来定义变量 惰性赋值 声明变量 我们将来每一天编写scala程序都会定义变量.那scala语言如何定义变量呢? 语法格 ...

  2. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

  3. 2021年大数据常用语言Scala(十四):基础语法学习 数组  重点掌握

    目录 数组  重点掌握 定长数组 变长数组 遍历数组 数组常用算法 数组  重点掌握 scala中数组的概念是和Java类似,可以用数组来存放一组数据.scala中,有两种数组,一种是定长数组,另一种 ...

  4. 2021年大数据常用语言Scala(一):Scala简介

    目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...

  5. 2021年大数据常用语言Scala(二十):函数式编程 介绍

    目录 函数式编程 介绍 函数式编程的意义在哪? 函数式编程 介绍 我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程.下面的这些操作是学习的重点. 现在我们将会逐渐接触函数式编程的方 ...

  6. 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap

    目录 扁平化映射 | flatMap 定义 案例 扁平化映射  flatMap 扁平化映射也是将来用得非常多的操作,也是必须要掌握的. 定义 可以把flatMap,理解为先map,然后再flatten ...

  7. 2021年大数据常用语言Scala(十六):基础语法学习 列表 List 重点掌握

    目录 列表 List 重点掌握 不可变列表定义 可变列表 列表常用操作 列表 List 重点掌握 列表是scala中最重要的.也是最常用的数据结构.List具备以下性质: 可以保存重复的值 有先后顺序 ...

  8. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

  9. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型

    目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...

最新文章

  1. 2022-2028年中国塑料鞋行业市场发展调研及未来前景规划报告
  2. python支持的数据类型list_Python基本数据类型之list
  3. 前台页面进行图片上传判断
  4. 解决oninput在输入中文时,会获取拼音的问题
  5. MySQL 为什么我的MySQL会“抖一下“?
  6. VTK:vtkCamera用法实战
  7. 【专升本计算机】2021年甘肃省专升本计算机全真模拟试题(二)
  8. 关于Exchange管理控制台报“您的权限不足,无法此查看数据”的解决办法
  9. matlab 功率谱密度 汉宁窗_[振动与测试 2] 什么是PSD(功率谱密度)
  10. tmp ubuntu 自动删除吗_tmp 目录文件被自动清理问题的调查
  11. 智能蓝牙控制、温湿度控制时间风扇
  12. 国民技术 MCU JLink仿真调试环境配置
  13. 从零到一搭建一个属于自己的博客系统(弌)
  14. senseTime,FaceU人脸识别技术
  15. [乐意黎原创]Win10 升级1909版本后,内存占用率居高不下的解决办法
  16. xcode登陆appleid报错:连接appleid服务器时出错
  17. Git GitHub 简明教程
  18. 深度学习概述-从神经计算角度
  19. VTK笔记——如何创建圆柱体
  20. 按照我的方式、一步步学接口自动化测试,不可能学不会!!

热门文章

  1. 2022-2028年中国橡胶带行业市场运营格局及未来前景分析报告
  2. docker通过镜像方式安装tomcat
  3. eclipse运行maven web项目
  4. pytorch lstm crf 代码理解 重点
  5. 命名实体识别入门教程(必看)
  6. Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪
  7. Java集合之并发容器
  8. Jenkins首次安装推荐插件出错 No such plugin: cloudbees-folder 超详细解决方案
  9. MLIR中间表示和编译器框架
  10. cuGraph-GPU图形分析