Function一个可以进行高阶函数式编程的模块。

chain

def chain[a](fs: Seq[(a) ? a]): (a) ? a

把一些列的方法串起来,挨个执行,每个方法的结果,回作为下一个方法的入参

/**定义两个函数*/
def fun1 = (v:Int) => {
val result = v *
println(result)
result
}
def fun2 = (v:Int) => {
val result = v *
println(result)
result
}
//使用
val funs = Seq(fun1,fun2)
Function.chain[Int](funs)() 运行原理:fun1的结果作为fun2的入参
结果打印

const

def const[T, U](x: T)(y: U): T

这是一个返回常量的方法,直接返回 x 值

假如我们要把一个序列中的元素替换成同一个值,可以使用
List(, , , , ).map(_=>)
我们可以用const来处理
List(, , , , ).map(Function.const())

tupled

def tupled[a1, a2, b](f: (a1, a2) ? b): ((a1, a2)) ? b

将二元函数转换为一个一元函数,参数为Tuple2类型

def tupleFunc = (a:Int,b:Int) => {
a+b
}
/**使用*/
val funs = Function.tupled(tupleFunc)
val v = (,)
println(v.getClass.getName)
println(funs(v))

def tupled[a1, a2, a3, b](f: (a1, a2, a3) ? b): ((a1, a2, a3)) ? b
同 tupled[a1, a2, b] def tupled[a1, a2, a3, a4, b](f: (a1, a2, a3, a4) ? b): ((a1, a2, a3, a4)) ? b
同 tupled[a1, a2, b]

def tupled[a1, a2, a3, a4, a5, b](f: (a1, a2, a3, a4, a5) ? b): ((a1, a2, a3, a4, a5)) ? b
同 tupled[a1, a2, b]

def untupled[a1, a2, b](f: ((a1, a2)) ? b): (a1, a2) ? b

def tupleFunc = (v:Tuple2[Int,Int]) => {
v._1 + v._2
}
//转换
val funs = Function.untupled(tupleFunc)
println(funs(,)) /** 8 */

def untupled[a1, a2, a3, b](f: ((a1, a2, a3)) ? b): (a1, a2, a3) ? b
同 tupled[a1, a2, b] def untupled[a1, a2, a3, a4, b](f: ((a1, a2, a3, a4)) ? b): (a1, a2, a3, a4) ? b
同 tupled[a1, a2, b]

def untupled[a1, a2, a3, a4, a5, b](f: ((a1, a2, a3, a4, a5)) ? b): (a1, a2, a3, a4, a5) ? b
同 tupled[a1, a2, b]

uncurried

def uncurried[a1, a2, b](f: (a1) ? (a2) ? b): (a1, a2) ? b

把一个柯里化函数转换为但 2 个参数的函数

/**声明一个柯里化函数*/
def curriedSum = (x:Int)=>(y:Int) => x + y
//转换
val funs = Function.uncurried(curriedSum)
println(funs(,))
结果:

def uncurried[a1, a2, a3, b](f: (a1) ? (a2) ? (a3) ? b): (a1, a2, a3) ? b
同 uncurried[a1, a2, b] def uncurried[a1, a2, a3, a4, b](f: (a1) ? (a2) ? (a3) ? (a4) ? b): (a1, a2, a3, a4) ? b
同 uncurried[a1, a2, b]

def uncurried[a1, a2, a3, a4, a5, b](f: (a1) ? (a2) ? (a3) ? (a4) ? (a5) ? b): (a1, a2, a3, a4, a5) ? b
道理同 uncurried[a1, a2, b]

unlift

def unlift[T, R](f: (T) ? Option[R]): PartialFunction[T, R]
将 A => Option[B] 类型的函数转换为 PartialFunction[T, R] 类型函数

def optionFun(x : Int) = {
println(x)
if (x > ) Some(x*) else None
}
//使用
val funs = Function.unlift(optionFun)
val chars = Array(,,)
//collect需要PartialFunction类型参数
val newchars = chars.collect(funs)
println(newchars.mkString(","))
/**输出为 10,20,30 */
05-23 04:55