一、隐式转换和隐式参数介绍
隐式转换和隐式参数是Scala中非常有特色的功能,也是Java等其他编程语言没有的功能。我们可以很方便地利用隐式转换来丰富现有类的功能。在后续编写Akka并发编程, Spark, Flink程序时都会经常用到它们。
- 隐式转换: 指的是用 implicit关键字 声明的带有 单个参数 的方法.
- 隐式参数: 指的是用 implicit关键字 修饰的变量.
注意: implicit关键字 是在Scala的2.10版本出现的
二、隐式转换
2.1 概述
所谓隐式转换,是指 以implicit关键字声明的带有单个参数的方法 。该方法是被自动调用的,用来实现 自动将某种类型的数据转换为另外一种类型的数据 。
2.2 使用步骤
1. 在 object单例对象 中定义隐式转换方法.
隐式转换方法解释: 就是用implicit关键字修饰的方法.
2. 在需要用到隐式转换的地方, 引入隐式转换.
2. 在需要用到隐式转换的地方, 引入隐式转换.
类似于 导包 , 通过 import关键字实现 .
3. 当需要用到 隐式转换方法 时, 程序会自动调用
3. 当需要用到 隐式转换方法 时, 程序会自动调用
2.3 示例一: 手动导入隐式转换方法
需求
通过隐式转换
,
让
File
类的对象具备有
read
功能
(
即
:
实现将文本中的内容以字符串形式读取出来
).
步骤
1.
创建
RichFile
类,提供一个
read
方法,用于将文件内容读取为字符串
2.
定义一个隐式转换方法,将
File
隐式转换为
RichFile
对象
3.
创建一个
File
类的对象,导入隐式转换,调用
File
的
read
方法
参考代码
2.4 隐式转换的时机
既然
隐式转换
这么好用
,
那什么时候程序才会
自动调用隐式转换方法呢?
1.
当对象调用类中不存在的方法或者成员时,编译器会自动对该对象进行隐式转换
2.
当方法中的参数类型与目标类型不一致时
,
编译器也会自动调用隐式转换
2.5 示例二: 自动导入隐式转换方法
在
Scala
中,如果
在当前作用域中有隐式转换方法 ,会自动导入隐式转换。
需求
:
将隐式转换方法定义在
main
所在的
object
单例对象
中
![](https://img-blog.csdnimg.cn/5d786f8a806e44bf9b88239f869e6497.png)
三、隐式参数
在
Scala
的方法中
,
可以带有一个
标记为
implicit
的参数列表
。调用该方法时
,
此参数列表可以不用给初始化值
,
因
为
编译器会自动查找缺省值,提供给该方法
。
3.1 使用步骤
1.
在方法后面添加一个参数列表,参数使用
implicit
修饰
2.
在
object
中定义
implicit
修饰的隐式值
3.
调用方法,可以不传入
implicit
修饰的参数列表,编译器会自动查找缺省值
注意
:
1.
和隐式转换一样,可以使用
import
手动导入隐式参数
2.
如果在当前作用域定义了隐式值,会自动进行导入
3.2 示例
需求
定义一个
show
方法,实现将传入的值,使用指定的前缀分隔符和后缀分隔符包裹起来.
例如
: show("
张三
")("<<<", ">>>"),
则运行结果为
: <<<
张三
>>>
- 使用隐式参数定义分隔符.
- 调用该方法,并打印结果
参考代码
方式一
:
手动导入隐式参数
![](https://img-blog.csdnimg.cn/45b9cced404e4ca9b280f2ec5566b908.png)
方式二: 自动导入隐式参数
//案例: 演示隐式参数, 自动导入.
//演示参数: 如果方法的某个参数列表用implicit修饰了, 则该参数列表就是: 隐式参数.
//好处: 我们再调用方法的时候, 关于隐式参数是可以调用默认的值, 不需要我们传入参数.
object ClassDemo04 {
//需求: 定义一个方法, 传入一个姓名, 然后用指定的前缀和后缀将该名字包裹.
//1. 定义一个方法show(), 接收一个姓名, 在接受一个前缀, 后缀信息(这个是隐式参数).
def show(name:String)(implicit delimit:(String, String)) = delimit._1 + name +
delimit._2
def main(args: Array[String]): Unit = {
//2. 自动导入 隐式参数.
implicit val delimit_defalut = "<<<" -> ">>>"
//3. 尝试调用show()方法.
println(show("李四"))
println(show("李四")("(((" -> ")))"))
}
}
四、案例: 获取列表元素平均值
需求
过隐式转换
,
获取列表中所有元素的平均值
.
目的
考察
隐式转换
,
列表
相关内容
步骤
1.
定义一个
RichList
类
,
用来给普通的
List
添加
avg()
方法,用于获取列表元素的平均值
.
2.
定义
avg()
方法
,
用来获取
List
列表中所有元素的平均值
.
3.
定义隐式转换方法
,
用来将普通
List
对象转换为
RichList
对象
.
4.
定义
List
列表
,
获取其中所有元素的平均值
参考代码
![](https://img-blog.csdnimg.cn/e0d4916eef2946d8852463cb3e490a2a.png)