Kotlin 简单优雅的高阶函数

Kotlin 简单优雅的高阶函数

最新上架!!!《 Kotlin极简教程》 陈光剑 (机械工业出版社)
可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程
http://www.jianshu.com/p/35b487734339

函数代表一种关系 f 的蕴涵逻辑流。这种蕴涵逻辑流,其实就是映射(Mapping)。

一切皆是映射。

我们说组合是编程的本质,其实,组合就是建立映射关系。

我们说,

程序 = 算法+数据结构

我们把程序看做图论里面的一张图G,这里的数据结构就是图G的节点Node, 而算法逻辑就是这些节点Node之间的Edge。整个的图G就是一幅美妙的抽象逻辑之塔的 映射图 。

1 . 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);
    }
}

5. 参考书籍:

时间: 2024-10-27 11:38:29

Kotlin 简单优雅的高阶函数的相关文章

玩转Kotlin 彻底弄懂Lambda和高阶函数

Lambda是什么 简单来讲,Lambda是一种函数的表示方式(言外之意也就是说一个Lambda表达式等于一个函数).更确切的说:Lambda是一个未声明的函数,会以表达式的形式传递 为什么要用Lambda 设想一下,在Android中实现一个View的点击事件,可以使用如下实现: View view = findViewById(R.id.textView); view.setOnClickListener(new View.OnClickListener() { @Override publ

ES6中的高阶函数:如同 a =&gt; b =&gt; c 一样简单

作者:Sequoia McDowell 2016年01月16日 ES6来啦!随着越来越多的代码库和思潮引领者开始在他们的代码中使用ES6,以往被认为是"仅需了解"的ES6特性变成了必需的代码常识.这不仅仅是新的语法学习 - 在许多范例中, ES6中新的语言特性可以让在ES5中写起来非常麻烦的表达变得更加简单,进而鼓励了新表达方式的使用.下面我们将关注一个这样简洁表达的使用范例:ES6中的箭头函数如何使高阶函数的书写更加简便. 高阶函数是至少具有以下两种功能之一的函数: 使用一个或多个函

F#教程:高阶函数

所谓高阶函数就是将某个函数作为输入参数或者返回值的函数.从名字上来看挺难理解的,不过从C#的角度来看就是传入或返回delegate之类的. 在我们自己定义高阶函数之前我们还是先学会使用高阶函数. List中定义了很多高阶函数,这回就学习下其中的几个.首先试下find函数. let list = [15; 7; 8; 3; 6; 10] let even n = n % 2 = 0 let x = List.find even list printfn "%A" x 其中,find的第一

函数式接口、默认方法、纯函数、函数的副作用、高阶函数、可变的和不可变的、函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分

本文讲的是函数式接口.默认方法.纯函数.函数的副作用.高阶函数.可变的和不可变的.函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分, 太棒了,我们又来到新的一天.这一次,我们要学一些新的东西让今天变得有意思起来. 大家好,希望你们都过得不错.这是我们的 RxJava2 Android 系列的第三篇文章. 第一部分 第二部分 在这篇文章中,我们将讨论函数式的接口,函数式编程,Lambda 表达式以及与 Java 8 的相关的其它内容.这

Scala入门到精通——第十三节 高阶函数

本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 部分应用函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返回值是函数的函数.这两种在本教程的第五节 函数与闭包中已经有所涉及,这里简单地回顾一下: (1)函数参数 //函数参数,即传入另一个函数的参数是函数 //((Int)=>String)=>String scala> def convertIntToString(f:(Int)=>Str

不学点高阶函数,如何愉快的装逼!

如果你开始接触函数式编程,你一定听说过高阶函数.在维基百科它的中文解释是这样的: 在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数: 接受一个或多个函数作为输入 输出一个函数 看起它就是ObjC语言中入参或者返回值为block的block或者函数,在Swift语言中即为入参或者返回值为函数的函数.那它们在实际的开发过程中究竟起着什么样的作用呢?我们将从入参.返回值和综合使用三部分来看这个问题: 函数作为入参 函数作为入参似乎无论在ObjC时代还是Swift时代都是司空见惯的事情,例如A

【SICP归纳】2 高阶函数和数据抽象

上一篇博文对应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么.书中展示了很多有趣的句法(syntax).现在我们要让思想进一步的抽象,写这篇博客的时候并未学完整本书,更不敢说对书中的内容有一个多深的领悟.但我一路学习过来,就感觉书中的示例越来越抽象,作者所引导我们的也是如此方向.博文也会持续更新下去,伴随着我的理解. 在这个专栏的[Scheme归纳]4 高阶函数中已经初步介绍了什么是高阶函数(Higher-order Procedures).而在这一节中,将用高阶函数来做抽象

高阶函数(软件编写)(第四部分)

本文讲的是高阶函数(软件编写)(第四部分), 原文地址:Higher Order Functions (Composing Software)(part 4) 原文作者:Eric Elliott 译文出自:掘金翻译计划 译者:reid3290 校对者:Aladdin-ADD.avocadowang Smoke Art Cubes to Smoke - MattysFlicks - (CC BY 2.0) 注意:这是"软件编写"系列文章的第四部分,该系列主要阐述如何在 JavaScrip

Javascript中的高阶函数介绍_javascript技巧

这是一个有趣的东西,这或许也在说明Javascript对象的强大.我们要做的就是在上一篇说到的那样,输出一个Hello,World,而输入的东西是print('Hello')('World'),而这就是所谓的高阶函数. 高阶函数 高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以上面的Hello,World作为一个简单的例子. 复制代码 代码如下: var Moqi = func