作为值的函数
import scala.math._
val num = 3.14
val fun = ceil _
fun(num)
匿名函数
val tripe = (x: Double) => 3 * x
def trip(x: Double) = 3 * x
Array(3.14, 1.42, 2.0).map(tripe)
//中括号
Array(3.14, 1.42, 2.0).map{
x => 3 * x
}
带函数参数的函数
def valueAtOneQuarter(f: Double => Double) = f(0.25)
valueAtOneQuarter(ceil _)
valueAtOneQuarter(sqrt _)
//类似柯里化
def mulBy(factor: Double) = (x: Double) => x * factor
val quintuple = mulBy(5)
quintuple(20)
类型推断
valueAtOneQuarter(x => 3 * x)
valueAtOneQuarter(_ * 3)
//推断不出类型
//val fun = 3 * _
val fun1 = 3 * (_: Double)
val fun2: Double => Double = 3 * _
一些有用的高阶函数
//map foreach filter reduce reduceLeft
//获取序列值可以从简单的序列中转化得出
(1 to 9).map(_*3).foreach(print(_))
//"*" * _
(1 to 9).map("*" * _).foreach(println(_))
(1 to 9).filter(_ % 2 == 0)
(1 to 9).reduceLeft(_ + _)
//def reduce[A1 >: A](op: (A1, A1) => A1): A1 = reduceLeft(op)
(1 to 9).reduce(_ + _)
柯里化
def mul(x: Int) = (y: Int) => x + y
//简写
def mulOneAtiTime(x: Int)(y: Int) = x + y
val a = Array("Hello", "World")
val b = Array("hello", "world")
println(a.corresponds(b)(_.equalsIgnoreCase(_)))
控制抽象
//没有输入,输出
def runInThread(block: => Unit) {
new Thread {
override def run(){block}
}.start()
}
//多条语句记得用中括号
runInThread{println(".."); Thread.sleep(1000); println("Bye")}
//模拟一个while循环
def until(condition: => Boolean)(block: => Unit) {
if (!condition) {
block
until(condition)(block)
}
}
var x = 10
until (x == 0){
println(x)
x -= 1
}