Kotlin 简单优雅的高阶函数
2017-08-31 本文已影响343人
光剑书架上的书
Kotlin 简单优雅的高阶函数
《Kotlin极简教程》正式上架:
点击这里 > 去京东商城购买阅读
点击这里 > 去天猫商城购买阅读
非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~
函数代表一种关系 f 的蕴涵逻辑流。这种蕴涵逻辑流,其实就是映射(Mapping)。
一切皆是映射。
我们说组合是编程的本质,其实,组合就是建立映射关系。
我们说,
程序 = 算法+数据结构
我们把程序看做图论里面的一张图G,这里的数据结构就是图G的节点Node, 而算法逻辑就是这些节点Node之间的Edge。整个的图G就是一幅美妙的抽象逻辑之塔的 映射图 。
image.png1 . Kotlin 函数式编程: 函数的组合。一切皆是函数。
fun main(args: Array<String>) {
val h = h(::g, ::f)
val strList = listOf("a", "ab", "abc","abcd","abcde","abcdef","abcdefg")
// 非常好用的流式 API filter,flat,map 等等
val mstrList = strList.filter(h)
println(mstrList)
mstrList.forEachIndexed{
index,value ->
println("$value = ${value.length}")
}
}
// 简单好用的 Kotlin 类型别名
typealias G=(String) -> Int
typealias F=(Int) -> Boolean
typealias H=(String) -> Boolean
// 简单直接的函数定义
fun f(x: Int) = x % 2 != 0
fun g(s: String) = s.length
// 简单优雅的高阶函数定义(复合函数): compose(f, g) = f(g(*))
fun h( g: G, f: F): H {
return { x -> f(g(x)) }
}
2. 简单好用的 Kotlin 类型别名
typealias G=(String) -> Int
typealias F=(Int) -> Boolean
typealias H=(String) -> Boolean
3. 非常好用的流式 API filter,flat,map 等等
val mstrList = strList.filter(h)
mstrList.forEachIndexed{
index,value ->
println("$value = ${value.length}")
}
4. 简单优雅的高阶函数定义(复合函数): compose(f, g) = f(g(*))
组合函数返回传递给它的两个函数的组合: (f、g) = f (g (*))。
现在, 您可以将其应用于可调用引用。
fun h( g: G, f: F): H {
return { x -> f(g(x)) }
}
val h = h(::g, ::f)
val strList = listOf("a", "ab", "abc","abcd","abcde","abcdef","abcdefg")
// 非常好用的流式 API filter,flat,map 等等
val mstrList = strList.filter(h)
同样的逻辑,我们在 Java 8中的实现代码是:
package com.easy.kotlin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
interface G {
Integer apply(String s);
}
interface F {
Boolean apply(Integer x);
}
interface H {
Boolean apply(String s);
}
public class InterfaceInvokeDemo {
public static void main(String[] args) {
G g = (s) -> s.length();
F f = (x) -> x % 2 != 0;
H h = (s) -> f.apply(g.apply(s));
List<String> strings = Arrays.asList(new String[] {"a", "ab", "abc", "abcd", "abcde", "abcdef", "abcdefg"});
List<String> result = new ArrayList();
for (String s : strings) {
if (h.apply(s)) {
result.add(s);
}
}
System.out.println(result);
}
}