作为函数的参数

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

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

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

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

更常见的使用方式为

  1. scala> (1 to 9).filter(_ % 2 == )
  2. res0: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)
  3. scala> (1 to 3).map(_ * )
  4. 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,例如

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

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

作为标识符

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

作为通配符

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

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

  1. scala> val t = (1, 3.14, "Fred")
  2. t: (Int, Double, String) = (1,3.14,Fred)
  3. scala> val (first, second, _) = t
  4. first: Int = 1
  5. second: Double = 3.14
  6. scala> val (first, _, _) = t
  7. first: Int = 1

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

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

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

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

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

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

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

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

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

  1. scala> val arr = Array(1,2,3,4,5)
  2. arr: Array[Int] = Array(1, 2, 3, 4, 5)
  3. scala> val Array(1, 2, _*) = arr
  4. scala> val Array(first, second, _*) = arr
  5. first: Int = 1
  6. 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(JWT,读作 [/dʒɒt/]),是一种基于JSON的.用于在网络上声明某种主张的令牌(token).JWT通常由三部分组成: 头信息(header) ...

  2. ③---Java项目管理工具MAVEN安装与配置

    Java项目管理工具MAVEN安装配置以下将为大家介绍Java项目管理工具MAVEN安装及其配置. 一.下载MAVEN安装文件 maven下载地址:https://maven.apache.org/d ...

  3. (六) JavaScript 对象

  4. CF1083E The Fair Nut and Rectangles

    CF1083E The Fair Nut and Rectangles 给定 \(n\) 个平面直角坐标系中左下角为坐标原点,右上角为 \((x_i,\ y_i)\) 的互不包含的矩形,每一个矩形拥有 ...

  5. ABAQUS复合材料

    转自)http://meiniyuan.blog.sohu.com/134141022.html 有很多帖子相当的不错,介绍了复合材料研究的基本的原理和方法,发现好的帖子再更新:0 c3 n0 ~+ ...

  6. ModelViewSet 路由 / django logging配置 / django-debug-toolbar使用

    一.ModelViewSet 路由 因为我们正在使用ViewSet代替View,实际上已经不再需要自己来设计URL的配置了.将资源和视图.URL绑定到一起是一个可以自动完成的过程,只需要使用Route ...

  7. 关于NETCORE中使用特性Serializable找不到引用的解决方法

    升级到netcore后,serializable特性不在命名空间System下了,需要nuget依赖包System.Runtime.Serialization.Formatters

  8. 配置linux-Fedora系统下iptables防火墙

    参考地址:https://blog.csdn.net/zhangjingyi111/article/details/78902820 本篇文章为实验课过程记录,较为简略. 1.查看系统是否安装ipta ...

  9. python之面向对象3

     面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...

  10. H5 16-并集选择器

    16-并集选择器 我是标题 我是段落 我是段落 我是段落 <!DOCTYPE html> <html lang="en"> <head> < ...