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

43 篇文章 1 订阅
6 篇文章 0 订阅

一、介绍

        目前在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自行定义,接口只想当一种类型

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

上面定义了一个Add类型,

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.第一种通过操作符类型自行执行

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

2.直接调用

add.add(10, 20)

2.3实战Demo

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.定义一个加法

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

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

    }

2.调用

    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.在函数体定义一个函数与方法中的参数函数一样,实现这个函数的方法体

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

        return a + b

    }

调用:

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

   val addNum3 = test.add(1, 2, test::addNum)

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

    val addNum2 = test.add(1, 2, ::addNum)

Demo:

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的写法中,高阶函数使用特别多,甚至一些开发者把高阶当成接口回调。新手特别注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin中,高阶函数有多种用法。除了使用Lambda表达式来传递函数参数外,还可以使用匿名函数和成员引用等方式。 Lambda表达式是最基本的高阶函数用法,通过Lambda表达式可以直在调用高阶函数时指定传入的参数。比如在调用num1AndNum2()函数时,可以通过Lambda表达式指定传入的两个整数参数进行求和。 除了Lambda表达式Kotlin还支持匿名函数的语法。匿名函数的写法更类似于常规的函数定义,可以有函数名和参数列表,而Lambda表达式则是简化的匿名函数写法。匿名函数适用于需要在函数体内使用return语句来提前返回结果的情况。 此外,Kotlin的编译器还会将高阶函数的语法转换成Java支持的语法结构。换句话说,Kotlin高阶函数在底层实现上会被转换成Java代码。具体来说,Kotlin高阶函数会被转换成收函数对象作为参数的Java方法。 总结来说,Kotlin高阶函数用法包括Lambda表达式、匿名函数和成员引用等。这些用法使得我们可以更灵活地编写代码,并将高阶函数的语法转换成Java支持的形式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Kotlin 高阶函数](https://blog.csdn.net/weixin_56504344/article/details/124973388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Kotlin高阶函数](https://blog.csdn.net/ChenYiRan123456/article/details/127983199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值