Scala 基础(8)—— 占位符_和部分应用函数
1. 占位符 _
针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替。
占位符_,用来表示一个或者多个参数。(这里的多个参数不是表示一个下划线代表多个参数,而是多个下划线可以代表多个参数)
在函数字面量的表达中,可以将下划线看成是“要填的空”,函数每次被调用时,这个“空”就回被一个参数“填”上。
例如:
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3)
list.filter(x => x > 0)
list.filter(_ > 0) // 与上面的调用是等价的
}
这种调用仅限于 Scala 编译器能够在编译期间推断出参数的类型。
当编译器无法再编译期间推断参数类型,则必须显式地给出参数类型。
例如:
def main(args: Array[String]): Unit = {
// val sum = _ + _ // 编译失败
val sum = (_: Int) + (_: Double)
println(sum(1,2)) // 输出3.0
}
2. 部分应用函数
在使用下划线时,本质上是在编写一个部分应用函数(partially applied function)。
这里的意义在于:
当调用某个函数,传入任何参数时,实际上是应用那个函数到这些参数上。
当然这种描述过于抽象,所以我们看下面的例子:
首先,定义一个方法 sum():
def sum(a: Int, b: Int, c: Int) = a + b + c
显然,这是一个计算三个整数和的方法。一般的调用方式如下:
val value = sum(1, 2, 3)
以上是一个简单的方法的调用,部分应用函数的功能,就是将 def 定义的方法,映射成函数值的形式。
例如:
val f = sum _ // f 是一个 (Int, Int, Int) => Int 类型的函数字面量
以上,将方法映射成了一个 (Int, Int, Int) => Int 类型的函数字面量。
它的调用方式与方法类似,但是本质发生了改变:
val value = f(1, 2, 3)
之所以称为部分应用函数,是因为你并没有把那个函数应用到所有的入参。
还是拿上面的例子做说明,可以通过给出一些必填的参数来表达一个部分应用函数:
val f = sum(1, _: Int, 2) // f 是一个 Int => Int 类型的函数字面量
在这个例子中,部分应用函数给出了第一个和第三个参数,由于只缺失一个参数,编译器将生成一个新的函数字面量,类型是 Int => Int。
部分应用函数的作用在于:
虽然不能将方法或嵌套的函数直接赋给某个变量,或者作为某个函数的入参,但是可以通过部分应用函数的方式,将其转成一个函数值来完成这些操作。
最后需要说明的是,只有明确需要函数的地方,才能使用部分应用函数。
Scala 基础(8)—— 占位符_和部分应用函数的更多相关文章
- scala占位符_的用法
占位符的用途颇多,先介绍几种常用的用法 1.作为"通配符",类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序 ...
- [转]scala和RDD中的占位符"_"
1.通配符.类似Java中的*.如:import scala.math._ 2.作为一个整体.:_*,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将 ...
- 【mybatis源码学习】mybtias基础组件-占位符解析器
一.占位符解析器源码 1.占位符解析器实现的目标 通过解析字符串中指定前后缀中的字符,并完成相应的功能. 在mybtias中的应用,主要是为了解析Mapper的xml中的sql语句#{}中的内容,识别 ...
- JDBC_PreparedStatement用法_占位符_参数处理
import java.sql.Connection; import java.sql.Date;import java.sql.DriverManager;import java.sql.Prepa ...
- 中国MOOC_零基础学Java语言_第7周 函数_2完数
2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序, ...
- 中国MOOC_零基础学Java语言_第7周 函数_1分解质因数
第7周编程题 查看帮助 返回 第7周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...
- mysql精准模糊查询使用CONCAT加占位符(下划线“_”)的使用,直接限定了长度和格式
比如现在有张表t_user,如下:(表中只是引用某某某的话,并无恶意) id name 1 司马懿 2 司马老贼 3 司马老贼OR司马懿 4 司马大叔 1.模糊查询一般用的模糊查询都是like关键词, ...
- scala基础语法(变量,数据类型,函数)
一:常量与变量 1.常量 2.两种变量定义方式(严格与不严格) 3.Float注意点 3.注意点 变量名后加上: 类型首字母是大写 4.占位符_ 但是需要制定类型 5.scala数据类型 6.其他类型 ...
- SpringBoot环境属性占位符解析和类型转换
前提 前面写过一篇关于Environment属性加载的源码分析和扩展,里面提到属性的占位符解析和类型转换是相对复杂的,这篇文章就是要分析和解读这两个复杂的问题.关于这两个问题,选用一个比较复杂的参数处 ...
随机推荐
- java循环删除List元素的方法总结
1.for循环 2.迭代器 3.过渡法 import java.util.*; /** * Created by HP on 2018/8/2. */ public class Test { publ ...
- MacBookPro 存储空间优化
首先,打开电脑内的"终端"; 其次,逐条录入下面的命令行,执行完成后,再次查看您的储存空间,多少会有一些优化,具体会优化出多少储存空间因您日常使用而定(本人清出了5G 空间,还不错 ...
- selenium webdriver 移动到某个位置,滚动到某个位置
https://blog.csdn.net/xiaosongbk/article/details/70231564
- 记一次FTP下载踩坑的故(shi)事(gu)
下班前领导忽然要求我将客户的日志服务器上一些日志拷贝到测试服务器中,不过领导只提供给我FTP的连接方式,很明显就是要我用FTP方式去做啦 一般来说FTP批量下载也就上网随便找个脚本的事,但是却成了我疯 ...
- is和==,encode和decode
0.编码解码 >encode和decode a = "你好" s = a.encode("GBK") print(s) # b'\xc4\xe3\xba\ ...
- TCP/IP协议之http和https协议
一.TCP/IP协议 TCP/IP 是不同的通信协议的大集合. 1.TCP - 传输控制协议 TCP 用于从应用程序到网络的数据传输控制. TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们 ...
- 数据库DDL
自己对数据库的整理,也是对自己知识的梳理 SQL ( Structure query language ) 结构化查询语言 SQL语言分为4个部分 1.DDL(Data Definition Lang ...
- JS简写
本文来源于多年的 JavaScript 编码技术经验,适合所有正在使用 JavaScript 编程的开发人员阅读. 本文的目的在于帮助大家更加熟练的运用 JavaScript 语言来进行开发工作. 文 ...
- caioj:1348: [NOIP普及组2012]质因数分解 C++
题目描述 已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入样例 21 输出样例 7 输入 输入只有一行,包含一个正整数n. 输出 输出只有一行,包含一个正整数p,即较大的那个质数 ...
- Ball CodeForces - 12D
传送门 N ladies attend the ball in the King's palace. Every lady can be described with three values: be ...