作为函数的参数

一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型。例如一个完整的匿名函数作为参数可以写为

scala> def compute(f: (Double)=>Double) = f(3)
compute: (f: Double => Double)Double //传递一个匿名函数作为compute的参数
scala> compute((x: Double) => 2 * x)
res1: Double = 6.0

如果参数x=>右侧只出现一次,可以用_替代这个参数,简写为

scala> compute(2 * _)
res2: Double = 6.0

更常见的使用方式为

scala> (1 to 9).filter(_ % 2 == )
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8) scala> (1 to 3).map(_ * )
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 6, 9)

以上所说的为一元函数,那么对于二元函数,即有两个参数x和y的函数,是如何使用_的?可以参考sortWith方法的定义
def sortWith(lt: (T, T) ⇒ Boolean): Array[T]
这个方法的参数官方解释为

the comparison function which tests whether its first argument precedes its second argument in the desired ordering.

这个方法需要的参数是一个二元函数,而且函数参数的类型为T,例如

scala> List(10, 5, 8, 1, 7).sortWith(_ < _)
res0: List[Int] = List(1, 5, 7, 8, 10)

可以用_分别表示二元函数中的参数x和y。

作为标识符

例如定义一个变量val _num = 123

作为通配符

  • import语句
    例如import scala.math._
  • case语句
    例如
object MatchTest extends App {
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
println(matchTest(3))
}
  • 元组(tuple)
    例如
//可以定义一个tuple
scala> val t = (1, 3.14, "Fred")
t: (Int, Double, String) = (1,3.14,Fred)
//可以用_1,_2,_3访问这个元组
scala> t._1
res3: Int = 1 scala> t._2
res4: Double = 3.14 scala> t._3
res5: String = Fred

可以通过模式匹配获取元组的元素,当不需要某个值的时候可以使用_替代,例如

scala> val t = (1, 3.14, "Fred")
t: (Int, Double, String) = (1,3.14,Fred) scala> val (first, second, _) = t
first: Int = 1
second: Double = 3.14 scala> val (first, _, _) = t
first: Int = 1

下划线和其他符号组合的使用方式

  • 下划线与等号(_=)
    自定义setter方法,请参见《Overriding def with var in Scala》

  • 下划线与星号(_*)
    1.变长参数
    例如定义一个变长参数的方法sum,然后计算1-5的和,可以写为

scala> def sum(args: Int*) = {
| var result = 0
| for (arg <- args) result += arg
| result
| }
sum: (args: Int*)Int scala> val s = sum(1,2,3,4,5)
s: Int = 15

但是如果使用这种方式就会报错

scala> val s = sum(1 to 5)
<console>:12: error: type mismatch;
found : scala.collection.immutable.Range.Inclusive
required: Int
val s = sum(1 to 5)
^

这种情况必须在后面写上: _*1 to 5转化为参数序列

scala> val s = sum(1 to 5: _*)
s: Int = 15

2.变量声明中的模式
例如,下面代码分别将arr中的第一个和第二个值赋给first和second

scala> val arr = Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5) scala> val Array(1, 2, _*) = arr scala> val Array(first, second, _*) = arr
first: Int = 1
second: Int = 2

 

链接:https://www.jianshu.com/p/0497583ec538

scala下划线的更多相关文章

  1. Scala下划线_使用

    下划线这个符号几乎贯穿了任何一本Scala编程书籍,并且在不同的场景下具有不同的含义,绕晕了不少初学者.正因如此,下划线这个特殊符号无形中增加Scala的入门难度.本文希望帮助初学者踏平这个小山坡. ...

  2. scala下划线的用法

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

  3. scala下划线的作用

    https://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala Existent ...

  4. scala中的下划线_

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

  5. scala的下划线

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

  6. Scala基础 - 下划线使用指南

    下划线这个符号几乎贯穿了任何一本Scala编程书籍,并且在不同的场景下具有不同的含义,绕晕了不少初学者.正因如此,下划线这个特殊符号无形中增加Scala的入门难度.本文希望帮助初学者踏平这个小山坡. ...

  7. Scala中_(下划线)的常见用法

    Scala中_(下划线)的常见用法 地址:https://www.jianshu.com/p/0497583ec538

  8. scala学习手记27 - 下划线与参数

    在Scala里,下划线(_)可以表示函数值的参数.如果某个参数在函数里仅使用一次,就可以用下划线表示.每次在函数里用下划线,都表示随后的参数. val arr = Array(1, 2, 3, 4, ...

  9. Scala中 下划线的用处

    From:   http://congli.iteye.com/blog/2169401 1.作为“通配符”,类似Java中的*.如import scala.math._ 2.:_*作为一个整体,告诉 ...

随机推荐

  1. JWT(JSON Web Token)

    摘要: 在Web应用中,使用JWT替代session并不是个好主意 适合JWT的使用场景 抱歉,当了回标题党.我并不否认JWT的价值,只是它经常被误用. 什么是JWT 根据维基百科的定义,JSON W ...

  2. [matlab] 5.字符运算与微积分

    首先介绍一下matlab里的符号计算 符号变量可以看成是数学中含参数 的表达式中的参数 matlab能进行像(a+b)(a-b)=a^2-b^2这样的计算 要进行符号计算首先要定义符号变量 定义符号对 ...

  3. 详解Transformer模型(Atention is all you need)

    1 概述 在介绍Transformer模型之前,先来回顾Encoder-Decoder中的Attention.其实质上就是Encoder中隐层输出的加权和,公式如下: 将Attention机制从Enc ...

  4. Java8时间的简单时间

    package com.java8.date; import org.junit.Test; import java.text.SimpleDateFormat; import java.time.* ...

  5. Python:Day19 正则表达式补充

    贪婪匹配 贪婪匹配是指字符后面是*+?的时候,都是尽可能多的匹配,如果不想尽可能多的匹配,那么在这三个字符后面加?号即可,这样变成惰性匹配,按最少匹配. ret = re.findall('ab??' ...

  6. TFT2.0液晶屏幕测试

    型号 尺寸:2.0寸 驱动芯片: ILI9225 分辨率:176*220 SPI 板载3.3v电平转换,直接插在arduino上可用. 安装这个库 这个库默认是 uno 板子的,如果换成mega256 ...

  7. 09 python初学 (字符串)

    # 重复输出字符串 print('hello' * 2) # >>>hellohello # 字符串切片操作,最重要的!!!! print('hello'[2:]) # >&g ...

  8. 初学Python——第一节课

    一.Python语言的特性: 1.与C语言不同,Python语言是一门解释性语言.程序在执行过程中,执行一步.编译一步. 2.Python是一个动态类型语言,不需要定义变量的数据类型. 3.Pytho ...

  9. [转]C#中基于GDI+(Graphics)图像处理系列之前言

    直接给出原文链接吧: C#中基于GDI+(Graphics)图像处理系列之前言 链接:https://pan.baidu.com/s/1zm5TCOHqkqEfiLZuqO0UMA 提取码:qz0h

  10. 【mongoDB查询进阶】聚合管道(一) -- 初识

    https://segmentfault.com/a/1190000010618355 前言:一般查询可以通过find方法,但如果是比较复杂的查询或者数据统计的话,find可能就无能为力了,这时也许你 ...