首页 技术 正文
技术 2022年11月14日
0 收藏 900 点赞 3,105 浏览 1989 个字

作为函数的参数

一个匿名的函数传递给一个方法或者函数的时候,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 = 1scala> t._2
res4: Double = 3.14scala> 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.14scala> 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*)Intscala> 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, _*) = arrscala> val Array(first, second, _*) = arr
first: Int = 1
second: Int = 2

 

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,090
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,567
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,415
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,187
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,824
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,906