packagecom.learn.scala.day16
importscala.math._
/**
* 第十六天函数
* Created by zhuqing on 2017/3/17.
*/
objectDay16Function {
defmain(args: Array[String]): Unit = {
/**
* 函数可以赋值给一个变量
* 函数有apply方法
*/
valtriple = (x: Double) =>3* x
/**
* 实际是:triple.apply(4)
*/
println(triple(4))
/**
* 10*3
*/
countTen(triple)
/**
*
* 10-5
*/
countTen((x: Double) => x -5)
/**
* 自动推断x为Double类型
*/
countTen((x) => x -5)
/**
* 自动推断“_”为第一个参数
*/
countTen(_ -5)
/**
* 是否math包下的方法
* _把方法转成函数
*/
countTen(sqrt_)
/**
* multiplyBy(3); 返回 函数(x:Double)=> 3*x;
*/
valtriple2 =multiplyBy(3)
/**
* 3*10
*/
println(triple2(10))
/**
* 把柯里化方法multiply 赋值给变量
* 柯里化:将原来接受两个参数的函数变成新的接受一个参数的函数的过程。
* 新的函数返回一个以原有第二个参数作为参数的函数
* 在这里:triple3=3*y
*/
valtriple3 =multiply(3) _
println(triple3(10))
println(indexOf("hello",'o'))
}
/**
* 函数可以作为方法的参数
* 作为参数的函数必须是参数为Double类型,返回值为double类型
*
*@param f
*@return
*/
defcountTen(f: (Double) => Double) = {
println(f(10))
}
/**
* 函数作为返回值
* 这是一个闭包:绑定了变量的函数。
*
*@param factor
*@return
*/
defmultiplyBy(factor: Double) = {
(x: Double) => factor * x;
}
/**
* 可柯里化的方法,功能与multiplyBy方法一样
*- * def multiply(x:Double)=(y:Double)=>x*y
*
*@param x
*@param y
*@return
*/
defmultiply(x: Double)(y: Double) = x * y
/**
* scala 不提倡在方法中使用return
* 但是有时候不得不使用
*
*@param str
*@param ch
*@return
*/
defindexOf(str:String, ch: Char): Int = {
for(i <-0until str.length) {
valc = str.charAt(i)
if(c == ch) {
returni;
}
}
-1
}
}