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)—— 占位符_和部分应用函数的更多相关文章

  1. scala占位符_的用法

    占位符的用途颇多,先介绍几种常用的用法 1.作为"通配符",类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序 ...

  2. [转]scala和RDD中的占位符"_"

    1.通配符.类似Java中的*.如:import scala.math._ 2.作为一个整体.:_*,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将 ...

  3. 【mybatis源码学习】mybtias基础组件-占位符解析器

    一.占位符解析器源码 1.占位符解析器实现的目标 通过解析字符串中指定前后缀中的字符,并完成相应的功能. 在mybtias中的应用,主要是为了解析Mapper的xml中的sql语句#{}中的内容,识别 ...

  4. JDBC_PreparedStatement用法_占位符_参数处理

    import java.sql.Connection; import java.sql.Date;import java.sql.DriverManager;import java.sql.Prepa ...

  5. 中国MOOC_零基础学Java语言_第7周 函数_2完数

    2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序, ...

  6. 中国MOOC_零基础学Java语言_第7周 函数_1分解质因数

    第7周编程题 查看帮助 返回   第7周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...

  7. mysql精准模糊查询使用CONCAT加占位符(下划线“_”)的使用,直接限定了长度和格式

    比如现在有张表t_user,如下:(表中只是引用某某某的话,并无恶意) id name 1 司马懿 2 司马老贼 3 司马老贼OR司马懿 4 司马大叔 1.模糊查询一般用的模糊查询都是like关键词, ...

  8. scala基础语法(变量,数据类型,函数)

    一:常量与变量 1.常量 2.两种变量定义方式(严格与不严格) 3.Float注意点 3.注意点 变量名后加上: 类型首字母是大写 4.占位符_ 但是需要制定类型 5.scala数据类型 6.其他类型 ...

  9. SpringBoot环境属性占位符解析和类型转换

    前提 前面写过一篇关于Environment属性加载的源码分析和扩展,里面提到属性的占位符解析和类型转换是相对复杂的,这篇文章就是要分析和解读这两个复杂的问题.关于这两个问题,选用一个比较复杂的参数处 ...

随机推荐

  1. linux系统中 redis 保存数据的5种形式 linux后端模式启动 jedis无法通过IP地址和端口号访问如何修改linux防火墙

    vim修改redis.conf配置文件(我的已经复制到虚拟机的/usr/local/redis/bin目录下)为daemonize yes, 以后端模式启动 ./redis-server redis. ...

  2. LeetCode426.Convert Binary Search Tree to Sorted Doubly Linked List

    题目 Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right point ...

  3. django+xadmin在线教育平台(九)

    django admin介绍 上一章我们进行了需求分析和数据库设计.本章我们来快速搭建一个可用的后台管理系统. 后台管理系统特点: 权限管理 少前端样式.(样式一般不是很看重), 快速开发 djang ...

  4. percona-zabbix-templates插件安装监控MySQL

    前期准备:被监控机已经安装好php 1.在zabbix客户端安装mysql监控插件rpm包 rpm -ivh https://www.percona.com/downloads/percona-mon ...

  5. MySQL运行一段时间后自动停止问题的排查

    在进入主题前,一定要先吐槽下自己,前段时间购买了一台阿里云服务器,最开始打算只是自己个人用的,就买了一台配置很寒碜的服务器: CPU: 1核 内存: 1 GB 操作系统: CentOS 7.2 64位 ...

  6. 开发工具cfree安装报错解决

    报错如下: [ --------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW-------------------- 检查文件依赖性... 正在编译 ...

  7. 【jQuery】输入框自带清除按钮

    最近一个项目,需要在输入框时右边出现“X”标志,点击X即可清空,主要使用了click和blur事件,难点在于点击‘X’时,input框获得焦点时出现“X”标志,而点击"x"标志时i ...

  8. 数据分析处理库Pandas——数值运算

    求和 对每行或每列求和. 均值 对每行或每列求均值. 最大最小值 对每行或每列求最大值或最小值. 中位数 对每行或每列求中位数. 相关系数和协方差 先导入一个DataFram结构的数据,再对这些数据计 ...

  9. 牛客网暑期ACM多校训练营(第四场) F Beautiful Garden

    链接: https://www.nowcoder.com/acm/contest/142/F 题意: n x m的矩形,选个p x q的矩形去掉,两个矩形中⼼重合,去掉后的矩形上下左右对称 求(p, ...

  10. perl连接mysql数据库

    首先需要安装 ppm install DBD::mysql use strict; use DBI; my $host = "localhost"; # 主机地址 my $driv ...