Scala基础:隐式转换与隐式参数

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala基础:隐式转换与隐式参数相关的知识,希望对你有一定的参考价值。

一、隐式转换和隐式参数介绍

隐式转换和隐式参数是Scala中非常有特色的功能,也是Java等其他编程语言没有的功能。我们可以很方便地利用隐式转换来丰富现有类的功能。在后续编写Akka并发编程, Spark, Flink程序时都会经常用到它们。

  • 隐式转换: 指的是用 implicit关键字 声明的带有 单个参数 的方法.
  • 隐式参数: 指的是用 implicit关键字 修饰的变量.

注意: implicit关键字 是在Scala的2.10版本出现的

二、隐式转换

2.1 概述

所谓隐式转换,是指 以implicit关键字声明的带有单个参数的方法 。该方法是被自动调用的,用来实现 自动将某种类型的数据转换为另外一种类型的数据 。

2.2 使用步骤

1. 在 object单例对象 中定义隐式转换方法. 隐式转换方法解释: 就是用implicit关键字修饰的方法.
2. 在需要用到隐式转换的地方, 引入隐式转换.
类似于 导包 , 通过 import关键字实现 .
3. 当需要用到 隐式转换方法 时, 程序会自动调用

2.3 示例一: 手动导入隐式转换方法

需求 通过隐式转换 , File 类的对象具备有 read 功能 ( : 实现将文本中的内容以字符串形式读取出来 ). 步骤 1. 创建 RichFile 类,提供一个 read 方法,用于将文件内容读取为字符串 2. 定义一个隐式转换方法,将 File 隐式转换为 RichFile 对象 3. 创建一个 File 类的对象,导入隐式转换,调用 File read 方法

参考代码

 2.4 隐式转换的时机

既然 隐式转换 这么好用 , 那什么时候程序才会 自动调用隐式转换方法呢? 1. 当对象调用类中不存在的方法或者成员时,编译器会自动对该对象进行隐式转换 2. 当方法中的参数类型与目标类型不一致时 , 编译器也会自动调用隐式转换

2.5 示例二: 自动导入隐式转换方法

Scala 中,如果 在当前作用域中有隐式转换方法 ,会自动导入隐式转换。 需求 : 将隐式转换方法定义在 main 所在的 object 单例对象

三、隐式参数

Scala 的方法中 , 可以带有一个 标记为 implicit 的参数列表 。调用该方法时 , 此参数列表可以不用给初始化值 , 编译器会自动查找缺省值,提供给该方法

3.1 使用步骤

1. 在方法后面添加一个参数列表,参数使用 implicit 修饰 2. object 中定义 implicit 修饰的隐式值 3. 调用方法,可以不传入 implicit 修饰的参数列表,编译器会自动查找缺省值 注意 : 1. 和隐式转换一样,可以使用 import 手动导入隐式参数 2. 如果在当前作用域定义了隐式值,会自动进行导入

3.2 示例

需求 定义一个 show 方法,实现将传入的值,使用指定的前缀分隔符和后缀分隔符包裹起来. 例如 : show(" 张三 ")("<<<", ">>>"), 则运行结果为 : <<< 张三 >>>
  • 使用隐式参数定义分隔符.
  • 调用该方法,并打印结果

参考代码 方式一 : 手动导入隐式参数

方式二: 自动导入隐式参数

//案例: 演示隐式参数, 自动导入.
//演示参数: 如果方法的某个参数列表用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 列表 , 获取其中所有元素的平均值 参考代码

以上是关于Scala基础:隐式转换与隐式参数的主要内容,如果未能解决你的问题,请参考以下文章

Scala零基础教学61-80

Scala隐式转换

Scala隐式参数

Scala基础高阶函数隐式转换AKKA编程

为啥这种显式转换的结果与隐式转换的结果不同?

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