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. java基础必备单词讲解 day five

    Rectangle width high height area employee tool param version author math guess resources 之前单词复习 path ...

  2. 给大家一个我的QQ群

    很少关注博客了,提供一个QQ群讨论 我的一个QQ群:158351344

  3. JS底层挖掘

    //Promise版本的Ajaxconst getJSON = function(url) { const promise =new Promise(function(resolve, reject) ...

  4. Latex 使用笔记,取消目录

    不使用标准模板(如ieee或者acm的模板)的前提下: \usepackage{hyperref} \hypersetup{bookmarks={false}} 或者 \usepackage[book ...

  5. MappingException:class com.zsn.crm.Model.user not found whie looking for property user id

    之前好好地运行 什么东西都没动过 再次运行突然报异常*****MappingException:class com.zsn.crm.Model.user not found whie looking ...

  6. 8-2 开发接口 (入参是json格式)

    1.开发入参事json格式的接口 import json import tools import flask from .check_session import check_session serv ...

  7. 侯捷《C++面向对象开发》——动手实现自己的复数类

    前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对 ...

  8. order-by-offset-fetch

  9. 008---Django的模版层

    python的模板:HTML代码+模板语法 <!--模版语法之变量--> <h1>Index </h1> <p>{{ name }}</p> ...

  10. 7 定制10MINs首页2

    1.添加 <div class="ui basic segment"> <h1 class="ui center aligned header" ...