Kotlin偏函数 刺骨的言语ヽ痛彻心扉 2022-05-28 09:58 182阅读 0赞 一、通过偏函数与柯里化函数的结合,来聊一聊偏函数到底是什么,怎么实现 看一个例子,main方法中就是偏函数的调用 package net.println.kotlin.chapter5.currying import java.io.OutputStream import java.nio.charset.Charset /** * @author:wangdong * @description:便函数 */ /** * 写一个打日志的东西 */ fun log(tag: String,target: OutputStream,message: Any?){ //打日志"\n"是换行的意思 target.write("[$tag] $message\n".toByteArray()) } /** * 柯里化它 * 1.首先传tag * 2.返回一个函数,函数再传target * 3.返回一个函数,函数再传Any */ /* * 这样写下去就很复杂了 fun log(tag: String): (target: OutputStream) -> (message: Any?){ }*/ /*** * 用一个简单的写法 */ /*fun log(tag: String) =fun(target: OutputStream) =fun(message: Any?) = target.write("[$tag] $message\n".toByteArray())*/ fun main(args: Array<String>) { log("benny",System.out,"HelloWorld") //log("benny")(System.out)("HelloWorld Again") ::log.curried()("benny")(System.out)("HelloWorld Again") //偏函数 //1.定义一个变量 //2.先柯里化一下它,对于固定每次都要传的参数,可以先固定一下它 //3.对于多参数函数,通过先指定它的一些固定的参数,得到的依然是一个函数,这个函数就是原来函数的偏函数 val consoleLogWithTag = (::log.curried())("benny")(System.out) consoleLogWithTag("Hello wang dong") consoleLogWithTag("helllo boy") consoleLogWithTag("hello girl") val bytes = "我是熊本同学".toByteArray(charset("GBK")) val stringFormGBK = makeStringFromGbKBytes(bytes) println(stringFormGBK) } /** * 这个柯里化就非常简单了 * 写一个扩展函数 * 三个参数那么就扩展Function3了 * 这样写就对了,目前请不要过分深究,他日在细细研究 */ fun <P1,P2,P3,R> Function3<P1,P2,P3,R>.curried() =fun (p1: P1) = fun (p2: P2) = fun (p3: P3) = this(p1,p2,p3) /**定义一个匿名函数 * 两个参数byteArry,charset * 返回String类型 */ val makeString = fun(byteArry: ByteArray,charset: Charset):String{ return String(byteArry,charset) } /** * 定义一个变量 * partial2是一个偏函数 * 第二个参数charset已经绑定为GBK */ val makeStringFromGbKBytes = makeString.partial2(charset("GBK")) /** * 定义一个扩展方法 * 参数是P1、P2 * 返回值是:R * 参数p2已经被偏函数绑定 * fun()只需要传第一参数就好了 * partial1和partial2都是绑定参数的 */ fun <P1,P2,R> Function2<P1,P2,R>.partial2(p2: P2) = fun(p1:P1) = this(p1,p2) fun <P1,P2,R> Function2<P1,P2,R>.partial1(p1: P1) = fun(p2:P2) = this(p1,p2) 输出的结果是: [benny] HelloWorld [benny] HelloWorld Again [benny] Hello wang dong [benny] helllo boy [benny] hello girl 我是熊本同学 好啦,结束啦
还没有评论,来说两句吧...