Android kotlin高阶函数与Java lambda表达式介绍与实战

一、介绍

目前在Java JDK版本的不断升高,新的表达式已开始出现,但是在Android混淆开发中,kotlin的语言与Java的语言是紧密贴合的。所以Java lambda表达式在kotlin中以新的身份出现:高阶函数与lambda表达式特别类似。接下来我讲会先讲Java的lambda,再介绍kotlin的高阶函数。

二、Java lambda表达式介绍与实战

2.1lambda的表达式格式介绍

复制代码
 1. 不需要参数,返回值为 5  
() -> 5  
  
 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

大致可以分为几类:

1.有参数无返回值(String msg)->

2.无参数有返回值()->Int

3.有参数有返回值(int a,int b)->()

2.2实战

Java lambda表达式是通过接口定义出来,一个接口只能定义一种类型,具体逻辑需要通过Java lambda自行定义,接口只想当一种类型

java 复制代码
interface Add {
    int add(int a, int b); //返回值
}

上面定义了一个Add类型,

java 复制代码
Add add = (int a, int b) -> (a + b);//什么+
Add sub = (int a, int b) -> (a - b);//申明-
Add mul = (int a, int b) -> (a * b);//申明

通过Add类型定义了三种lambda操作符。这样就完成了

使用

1.第一种通过操作符类型自行执行

java 复制代码
public int operation(int a, int b, Add add) {
    return add.add(a, b);
}

2.直接调用

java 复制代码
add.add(10, 20)

2.3实战Demo

java 复制代码
public class TestJava {


    @Test
    public void main() {
        TestJava tester = new TestJava();


        Back back = () -> 4;

        Log log = (String msg) -> com.example.lib.Log.INSTANCE.log(msg);
        //单个形参,可以不用注明变量类型
        Log log1 = msg -> com.example.lib.Log.INSTANCE.log(msg);

        Add add = (int a, int b) -> (a + b);//什么+
        Add sub = (int a, int b) -> (a - b);//申明-
        Add mul = (int a, int b) -> (a * b);//申明


        com.example.lib.Log.INSTANCE.log("back=" + back);
        log.log("我调用了Log");
        com.example.lib.Log.INSTANCE.log("add=" + add.add(10, 20));
        tester.operation(50, 10,add);
        tester.operation(50, 10,sub);


    }






    public int operation(int a, int b, Add add) {
        return add.add(a, b);
    }

    interface Back {

        int back(); //返回固定参数

    }

    interface Add {
        int add(int a, int b); //返回值


    }

    interface Log {
        void log(String msg);
    }
}

三、kotlin的高阶函数定义与使用

通过Java的lambda的表达式学习,已掌握了表达式的使用。在kotlin中,把lambda的表达式定义为高阶函数。用法差不多

在kotlin中,高阶函数的定义:

格式:函数名(形参类型...)->返回值

例如:add(Int ,Int)->Int,log(String)->Unit

形参只需要申明参数类型,可以支持多个或者为空。返回值,如果不需要直接些Unit

使用教程

kotlin的高阶函数与Java的lambda表达式很相似,但是用法不同,高阶函数是用在函数中的,作为参数使用。类似与接口回调。

实战:

1.定义一个加法

Kotlin 复制代码
 fun add(a: Int, b: Int, log: (Int, Int) -> Int) {

        val data = log(a, b)
        Log.log(data)

    }

2.调用

Kotlin 复制代码
    test.add(2, 3, { a, b ->
        Log.log("a + b=${a + b}")
        a + b
    })

    test.add(2, 4) { a, b ->

        a + b
    }

正常调用有两种:

1.参数在方法体中(2,3,{a,b->})

2.方法外(2,4){a,b->}

注意:如果有返回值,最后一行表达式或者参数将作为函数变量返回,无需用return

引用调用两种:

1.在函数体定义一个函数与方法中的参数函数一样,实现这个函数的方法体

Kotlin 复制代码
    fun addNum(a: Int, b: Int): Int {

        return a + b

    }

调用:

用当前函数变量引用这个方法即可

Kotlin 复制代码
   val addNum3 = test.add(1, 2, test::addNum)

2.在函数体外定义一个方法,kotlin支持在函数体外定义函数,这个函数类似全局函数,只是调用只需指向函数名,不需要当前类。

Kotlin 复制代码
    val addNum2 = test.add(1, 2, ::addNum)

Demo:

Kotlin 复制代码
class Test {


    fun add(a: Int, b: Int, log: (Int, Int) -> Int) {

        val data = log(a, b)
        Log.log(data)

    }

    fun log(msg: String, show: (String) -> Unit) {
        show(msg)
    }

    fun addNum(a: Int, b: Int): Int {

        return a + b

    }

}

fun main() {
    val test = Test()
    test.add(2, 3, { a, b ->
        Log.log("a + b=${a + b}")
        a + b
    })

    test.add(2, 4) { a, b ->

        a + b
    }



    test.log("msg") {

        Log.log(it)

    }

    val addNum2 = test.add(1, 2, ::addNum)
    Log.log("addNum2=${addNum2}")

    val addNum3 = test.add(1, 2, test::addNum)
    Log.log("addNum3=${addNum3}")
}

// ::addNum 这是一种函数引用的写法,表示将函数addNum()来作为参数传递给高阶函数
fun addNum(a: Int, b: Int): Int {

    return a + b

}

四、总结

kotlin的写法是比较特殊,高阶函数类似接口返回,Java中的lambda的表达式,更像一个定义语言。但是语法接口类似,只是在使用上有所区别。

特别是kotlin,在大趋势kotlin的写法中,高阶函数使用特别多,甚至一些开发者把高阶当成接口回调。新手特别注意。

相关推荐
Swift社区42 分钟前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT2 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy2 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss3 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续3 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben0443 小时前
ReAct模式解读
java·ai
轮到我狗叫了4 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条
java·开发语言·算法
Volunteer Technology5 小时前
三高项目-缓存设计
java·spring·缓存·高并发·高可用·高数据量
栗子~~5 小时前
bat脚本- 将jar 包批量安装到 Maven 本地仓库
java·maven·jar