《Kotlin极简教程》第六章 Kotlin函数式编程(FP)

简介: Kotlin对函数式编程的实现恰到好处。正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial京东JD:https://item.

Kotlin对函数式编程的实现恰到好处。

正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial
京东JD:https://item.jd.com/12181725.html
天猫Tmall:https://detail.tmall.com/item.htm?id=558540170670

函数指针

/**
 * "Callable References" or "Feature Literals", i.e. an ability to pass
 * named functions or properties as values. Users often ask
 * "I have a foo() function, how do I pass it as an argument?".
 * The answer is: "you prefix it with a `::`".
 */

fun main(args: Array<String>) {
    val numbers = listOf(1, 2, 3)
    println(numbers.filter(::isOdd))
}

fun isOdd(x: Int) = x % 2 != 0

运行结果: [1, 3]

复合函数

看了下面的复合函数的例子,你会发现Kotlin的FP的实现相当简洁。(跟纯数学的表达式,相当接近了)

/**
 * The composition function return a composition of two functions passed to it:
 * compose(f, g) = f(g(*)).
 * Now, you can apply it to callable references.
 */

fun main(args: Array<String>) {
    val oddLength = compose(::isOdd, ::length)
    val strings = listOf("a", "ab", "abc")
    println(strings.filter(oddLength))
}

fun isOdd(x: Int) = x % 2 != 0
fun length(s: String) = s.length

fun <A, B, C> compose(f: (B) -> C, g: (A) -> B): (A) -> C {
    return { x -> f(g(x)) }
}


运行结果: [a,abc]

简单说明下

val oddLength = compose(::isOdd, ::length)
    val strings = listOf("a", "ab", "abc")
    println(strings.filter(oddLength))

这就是数学中,复合函数的定义:

h = h(f(g))

g: A->B
f: B->C
h: A->C

g(A)=B
h(A) = f(B) = f(g(A)) = C

只是代码中的写法是:

h=compose( f, g )
h=compose( f(g(A)), g(A) )

/**
 * The composition function return a composition of two functions passed to it:
 * compose(f, g) = f(g(*)).
 * Now, you can apply it to callable references.
 */

fun main(args: Array<String>) {
    val oddLength = compose(::isOdd, ::length)
    val strings = listOf("a", "ab", "abc")
    println(strings.filter(oddLength))
    
    println(strings.filter(::hasA))
    println(strings.filter(::hasB))
    
    val hasBStrings = strings.filter(::hasB)
    println(hasBStrings)
    
    val evenLength = compose(::isEven,::length)
    println(hasBStrings.filter(evenLength))
    
    
}

fun isOdd(x: Int) = x % 2 != 0
fun isEven(x:Int) = x % 2 == 0
fun length(s: String) = s.length
fun hasA(x: String) = x.contains("a")
fun hasB(x: String) = x.contains("b")



fun <A, B, C> compose(f: (B) -> C, g: (A) -> B): (A) -> C {
    return { x -> f(g(x)) }
}

fun <W,X,Y,Z> compose2( h: (Y) -> Z, f:(X) -> Y,g:(W) -> X): (W) -> Z {
    return  {x -> h(f(g(x)))} 
}



运行结果:

[a, abc]
[a, ab, abc]
[ab, abc]
[ab, abc]
[ab]

相关文章
|
11月前
|
JavaScript 前端开发 安全
开心档-Kotlin 教程
【摘要】 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。 Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。 在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言。
|
Java Kotlin 索引
【Kotlin 初学者】函数式编程
一、函数式编程概念 1.1 面向函数编程(FOP) 在函数式编程(FP)中,一切皆是函数。FP是关于不变性和函数组合的一种编程范式。 函数式语言提倡在有限的几种关键数据结构(如list、set、map)上,运用函数的组合(高阶函数)操作,自底向上地来构建世界。Kotlin支持多种编程范式,所以你可以混用面向对象编程和函数式编程范式来解决手头的问题。
122 0
【Kotlin 初学者】函数式编程
|
存储 前端开发 IDE
Kotlin 初学者教程【Kotlin 专题 1】
关于 Kotlin 编程 开源- Kotlin 编译器、Intellij IDEA 插件和构建工具都是开源的。 可互操作- Kotlin 与 Java 100% 可互操作。这意味着您当前的所有 Java/Android 代码都可以与 Kotlin 无缝协作。 简洁- 与 Java 相比,Kotlin 代码更加简洁。此外,Kotlin 代码更具表现力(更易于理解和编写)。 工具友好- Kotlin 由 JetBrains 开发,该公司以创建开发工具而闻名。您可以选择任何 Java IDE 来编写 Koltin 代码。
197 0
Kotlin 初学者教程【Kotlin 专题 1】
|
Java Kotlin 开发工具
《Springboot极简教程》Springboot使用Kotlin和Java混合编程
配置 要想实现Springboot使用Kotlin和Java混合编程,需要使用kotlin插件: spring-boot-gradle-plugin kotlin-gradle-plugin 具体配置如下: apply { plugin "ko...
1502 0
|
存储 Java
《Kotlin极简教程》第三章 Kotlin基本数据类型
正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https://detail.tmall.com/item.htm?id=558540170670 在 Kotlin 中,所有东西都是对象:数字、字符、布尔和数组。
940 0
|
Java C#
《Kotlin极简教程》第五章 Kotlin面向对象编程(OOP)
一个OOP版本的HelloWorld 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.
898 0
|
Web App开发 存储 Java
《Kotlin极简教程》第四章 Kotlin基础语法
正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.
899 0
|
Web App开发 关系型数据库 Java
《Kotlin极简教程》第七章 Kotlin 集成 Springboot开发WebApp
本章请参考: 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.
1218 0
《Kotlin极简教程》第二章 Hello,World 函数
正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https://detail.tmall.com/item.htm?id=558540170670 此开篇第二回。
1163 0
《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)
第六章 Kotlin 函数式编程(FP) 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https://detail.tmall.com/item.htm?id=558540170670 1. 函数式编程概述 从本质上来说, 程序就是一系列有序执行的指令集合。
1212 0