Scala语言为了让函数字面量更加精简,还可以使用下划线作为占位符,用来表示一个或多个参数

我们用来表示的参数必须满足只在函数字面量中出现一次。

我们用例子来看占位符的用法

scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5) scala> list.filter( _ > 3 )//等同于 x => x > 3
res0: List[Int] = List(4, 5)

我们看到 _ 就好像是表达式中需要被填入的空,函数每次调用的时候这个空就被一个传入参数填上

但是参数是依次填入的,不能重复。也就是说,像上例的 1,2,3,4,5.并不能从头再来依次。

scala> val nums = List(1,2,3,4,5)
nums: List[Int] = List(1, 2, 3, 4, 5) scala> nums.map((_,1)) //等同于 x => (x,1)
res1: List[(Int, Int)] = List((1,1), (2,1), (3,1), (4,1), (5,1))

当然,我们也可以使用多个占位符来表示多个参数。

scala> val nums = List(1,2,3,4,5)
nums: List[Int] = List(1, 2, 3, 4, 5) scala> nums.reduce( _+_ ) //相当于 a + b
res2: Int = 15

上例中,第一个占位符代表一个参数,第二个代表不同于第一个的参数。

执行过程是这样的,先第一个参数 1 填上第一个占位符,第二个参数 2 填入第二个占位符,注意这里并不是参数列表从新填一次。

执行1+2 = 3.因为reduce,3重新排入list中,list现在为3,3,4,5

然后再次填入,3 + 3,list中变为 6,4,5

依次类推。结果为 15.

但是注意,我们在使用占位符的时候,编译器可能并没有足够的信息区推断你缺失的类型

使用的时候不要盲目的省略,避免造成不必要的错误。

scala> val f = _ + _
<console>:11: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
val f = _ + _
^
<console>:11: error: missing parameter type for expanded function ((x$1: <error>, x$2: <error>) => x$1.$plus(x$2))
val f = _ + _
^

上面的例子就是,我们在定义 f 方法的时候只用了占位符来表示两个参数,但是编译器并不能推断出你的参数类型,报错。

这个时候我们需要注明参数类型

scala> val f = (_:Int) + (_:Int)
f: (Int, Int) => Int = $$Lambda$1108/2058316797@4a8bf1dc scala> f(1,2)
res5: Int = 3

为什么我们开始的例子不用注明参数类型呢?因为我们在创建List的时候指明了类型为List[Int] 也就是编译器知道每个参数都为Int

注意,当使用多个占位符的时候,代表的是不同的参数,不能是相同的参数。

占位符也可以代替一个参数列表

scala> def sum(a:Int,b:Int,c:Int) = a+b+c
sum: (a: Int, b: Int, c: Int)Int scala> val a = sum _
a: (Int, Int, Int) => Int = $$Lambda$1137/810864083@755a4ef5

我们这里用了一个占位符代替了sum方法的参数列表,注意方法和占位符之间要有个空格,因为scala语言中方法名可以定义这样:sum_ 。

我们在创建方法的时候并不能用占位符来代替参数列表,编译器并不能推断出占位符代表的东西。

只能用占位符来代替已经明确的东西,也就是说来代替已经定义好的方法的参数列表。

scala> val b = sum(1,_:Int,3)
b: Int => Int = $$Lambda$1138/1122185195@3652dd19 scala> b(2)
res6: Int = 6

我们还可以这么用,用占位符来代替其中的一个参数,然后调用的时候只需要传入一个参数即可。

注意,这里代替的时候输出初始化一个参数,必须要表明参数类型。

当然有的时候我们还可以更省略,不过只能用在明确需要函数的时候。

scala> list.foreach(println _)
1
2
3
4
5 scala> list.foreach(println)
1
2
3
4
5

  

【scala】占位符的更多相关文章

  1. scala占位符_的用法

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

  2. Scala 占位符在REPL和Eclipse/IDEA中初始化变量问题

    占位符在REPL和Eclipse/IDEA中初始化变量问题: 占位符初始化,如果是局部变量,都会报错!只能在全局变量中使用! REPL: Eclipse: IDEA: 如果是类的属性,却就是对的.

  3. scala学习笔记(4):占位符

    scala 中占位符的用法 1.作为“通配符”,类似Java中的*.如import scala.math._ 2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = s ...

  4. Scala学习笔记(六):本地函数、头等函数、占位符和部分应用函数

    本地函数 可以在方法内定义方法,这种方法叫本地函数,本地函数可以直接访问父函数的参数 def parent(x: Int, y: Int): Unit ={ def child(y:Int) = y ...

  5. Scala 基础(8)—— 占位符_和部分应用函数

    1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...

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

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

  7. .NET 基础 一步步 一幕幕[运算符、占位符、转义符]

      运算符.占位符.转义符 好吧,在五局全胜之后,终于升到了三个钻,距离一个星星还有一大段距离,忽然想起来今天的博客还没写,果断坑队友,来写博客了....感觉以后还是每天更新一篇比较好.要不晚上就该熬 ...

  8. 占位符行为 PlaceHolderBehavior 的实现以及使用

    这个效果我不太会描述 PlaceHolder直译占位符 也有人把这个效果叫水印效果 就是和HTML5的PlaceHolder属性一样的效果 上图直观: 使用方法: 首先下载 占位符行为dll.rar  ...

  9. [Sass]占位符 %placeholder

    [Sass]占位符 %placeholder Sass 中的占位符 %placeholder 功能是一个很强大,很实用的一个功能,这也是我非常喜欢的功能.他可以取代以前 CSS 中的基类造成的代码冗余 ...

随机推荐

  1. JSP--JSP语法--指令--include(动态包含/静态包含)--九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构

    一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1.    JSP模板元素:JSP中HT ...

  2. 系列文章(二):从WLAN的安全威胁,解析电信诈骗的技术症结——By Me

    导读:互联网的无线接入已经成为大趋势,其中无线局域网(又称为WLAN,Wireless Local AreaNetwork)以其使用方便.组网灵活.可扩展性好.成本低等优点,成为互联网特别是移动互联网 ...

  3. java 自制Tomcat Andorid IOS 端 证书

    java 自制证书 最近做项目用到Https 需要自制各种证书,Tomcat 用的JKS 格式, Andorid 端使用 BKS 格式, IOS 端使用 P12格式正式, 以及各种证书格式之间的转换. ...

  4. Web框架(Day64)

    阅读目录 http协议 web应用与web框架 一.http协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World W ...

  5. go——接口

    Go语言提供了另外一种数据类型,即接口,它把所有具有共性的方法定义在一起,任何其它类型只要实现了这些方法就是实现了这个接口. 接口代表一种调用契约,是多个方法声明的集合.在某些动态语言里,接口(int ...

  6. Soap 教程

    SOAP 构建模块 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: · 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 · 可选的 Header 元素 ...

  7. IO 复习笔记

    输入流,从源到流中:输出流,从流到目的地. 1. 操作文件:     1).写入:FileOutputStream或者FileWriter     2).读取:FileInputStream或者Fil ...

  8. IDEA MAVEN Project 显示问题

    今天正常打开idea,却发现maven窗口找不到了:试了这些方法 首先idea自带了maven控件,不像Eclipse还需要下载控件,如果你以前有maven在右边,出于某种原因,消失找不到 了,你可以 ...

  9. eclipse中自动加载源码的方法

    1.选中项目右键properties--java build path--Libraries--Add External class Folder 找到项目将项目添加进去 2.然后就是这样 3.OK

  10. 外部类与main方法笔记

    外部类 1. 外部public class只能有一个 2. 外部类只能有两种访问控制级别: public 和默认 3. 一个文件中,可以有多个public class,即外部类为public,还可以有 ...