Kotlin高阶函数及Lambda表达式实现接口回调

【Kotlin】探索回调机制:函数类型、高阶函数和接口 在本文中,我们将深入探讨 Kotlin 中的三种回调机制:`函数类型`、`高阶函数`和`接口`。我们将分析它们的优缺点,并讨论在哪些情况下应该选择哪种机制。无论你是初学者还是有经验的 Kotlin 开发者,本文都将为你提供有关如何在应用程序中实现回调的清晰指导。 阅读详情

什么是高阶函数?

高阶函数是将函数作为参数或者返回值的函数。

  • 特点

    • 参数可以是函数
    • 返回值可以是函数
    • 所有函数类型都有一个圆括号括起来的参数类型列表及一个返回类型
  • 举个🌰

    var onClick:()->Util      //onClick变量类型为:无参且无返回类型的函数
    var onClick:(A,B)->C      //onCick变量类型为:参数类型分别为A,B,返回类型为C的函数
    
    (x:Int,y:Int)             //函数类型可以选择性包含函数的参数名,用于表明参数含义 
    
    ((Int,Int)->Util)?        //如果函数类型可为空,要使用圆括号后加?
    

    上述就是一个高阶函数用法,定义某个变量的类型为函数,

    注意:

    • 参数类型可以为空()
    • Unit返回类型不可省略
  • 函数类型实例调用

    函数类型的值可以通过其invoke(...)操作符调用:f.invoke(x)或者直接f(x)

Lambda 表达式

  • 简述

    • lambda 表达式总是被大括号括着,
    • 其参数(如果有的话)在 —> 之前声明(参数类型可以省略),
    • 函数体(如果存在的话)在 —> 后面。
    • lambda隐式返回最后一个表达式的值(或者使用限定的返回语法显示返回一个值)
  • 语法

    val sum:(Int,Int)->Int={ x:Int,y:Int->x+y}
    

在 Kotlin 中有一个约定,如果函数的最后一个参数是一个函数,并且你传递一个 lambda 表达式作为相应的参数,你可以在圆括号之外指定它:

比如map函数

//map函数最后一个参数是一个函数
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
      val result = arrayListOf<R>()
      for (item in this)
        result.add(transform(item))
      return result
     }
//使用
val dataList = list.map{it—>
            it*2
	}

使用Kotlin高阶函数实现接口回调

在学习使用Kotlin高阶函数实现接口回调之前,先看看我们在Java中接口回调通常使用方法

Java中接口使用
  • 普通使用

    定义接口

    public interface ICallback {
        void nextFun(String message);
    
        void errorFun(int code, String message);
    }
    

    业务中使用

    public class LoginLogicImpl {
        //声明login方法,参数为ICallback回调接口类型
        public void login(ICallback callback) {
            //TODO...
            if (true) {
                callback.nextFun("success");
            } else {
                callback.errorFun(404, "not found page");
            }
        }
    }
    

    外部调用(通过匿名内实现接口的回调)

    public class LoginLogicPresenter {
        LoginLogicImpl loginLogic = new LoginLogicImpl();
    
        public void login() {
            loginLogic = new LoginLogicImpl();
            /**
             *调用LoginLogicImpl的login方法,通过new ICallback()匿名类方式实现接口回调。
             *必须显示声明所有接口中的回调方法。
             */
            loginLogic.login(new ICallback() {
                @Override
                public void nextFun(String message) {
    								Log.d(TAG,"message->" + message)
                }
    
                @Override
                public void errorFun(int code, String message) {
    								Log.e(TAG,"code->" + code + "message->" + message)
                }
            });
        }
    }
    

    如上我们在使用该接口时候,需要显示的声明接口内所有的回调方法,如果不需要显示声明所有借口回调方法怎么办呢? 那么我们可以通过提供一个该接口的实现类来达到需求,具体实现如下

  • 简单使用

    声明接口的实现类

    public class CallbackImpl implements ICallback {
        @Override
        public void nextFun(String message) {
    
        }
    
        @Override
        public void errorFun(int code, String message) {
    
        }
    }
    

    业务中使用

    public class LoginLogicImpl {
            //声明函数,参数为回调接口的实现类
            public void register(CallbackImpl callbackImpl){
                //TODO...
                if(true){
                    callbackImpl.nextFun("success");
                }else{
                    callbackImpl.errorFun(404,"not found page");
                }
            }
    }
    

    外部调用

     public class LoginLogicPresenter {
        LoginLogicImpl loginLogic = new LoginLogicImpl();
        public void register() {
                /**
                 *调用LoginLogicImpl的register方法,通过new CallbackImpl()匿名类
                 *实现回调(可选择性的显示声明接口内回调方法)
                 */
                loginLogic.register(new CallbackImpl() {
                    @Override
                    public void nextFun(String message) {
                        super.nextFun(message);
                        Log.d(TAG,"success->" + message);
                    }
                    //@Override  可根据需要选择性的显示回调方法
                    //public void errorFun(int code, String message) {
                    //    super.errorFun(code, message);
                    //}
                });
            }
     }
    
Kotlin中接口使用

在kotlin中如果我们按照Java的思想进行接口开发使用,大概会有如下实现

  • Kotlin中接口普通使用

    定义接口

    interface ICallback {
        fun nextFun(message: String)
        fun errorFun(code: Int, message: String)
    }
    

    业务中使用

    object LoginLogicImpl {
        //声明login方法,参数为:ICallback回调接口类型
        fun login( callback: ICallback) {
            //todo...
            if (true) {
                callback.nextFun("success")
            } else {
                callback.errorFun(400, "failure...")
            }
        }
    }
    

    外部使用(使用object对象表达式,类似于java中的匿名类)

    class LoginLogicPresenter {
        fun login() {
            /**
             *调用LoginLogicImpl的login方法,使用object对象表达式实现接口回调(必须要显示声明接口中
             *全部回调方法)
             */
            LoginLogicImpl.login(object : ICallback {
                override fun nextFun(message: String) {
                    println("success->$message")
                }
    
                override fun errorFun(code: Int, message: String) {
                    println("failure->$code,$message")
                }
            })
        }
    }
    

    上面就是我们在kotlin中通过java思想实现的接口,使用了object对象表达式(类似Java中匿名类) 实现回调。

    在我们使用Android系统提供的View的setOnClickListener方法时候,我们发现其除了提供object对象表达式方式之外,还提供了setOnClickListener(it->)方法,如下

    button.setOnClickListener(object :View.OnClickListener{
                override fun onClick(v: View?) {
                   //TODO
                }
     })
    
    button.setOnClickListener {it->
        //TODO
    }
    

    可见后者并没有使用object对象表达式,而是通过kotlin的高阶函数和Lambda表达式实现。那么我们是不是也可以将我们之前的接口更改为此种方式呢?当然可以!!如下:

  • 使用Kotlin高级函数和Lambda优化接口回调

    • 定义接口:声明回调函数

      /**
       *定义回调接口
       */
      interface IResponseCallback<T> {
          
          fun nextFun(data: T?) 
          
          fun errorFun(code: Int, message: String)   
      }
      
    • 定义接口实现类:声明函数类型变量和对外提供的回调方法(与接口回调功能保持一致),并实现接口内回调方法

      • 声明函数类型变量(参数与接口回调函数一致)

        class ResponseCallbackListener<T> : IResponseCallback<T> {
            //通过高阶函数声明函数类型变量(参数与接口互调函数一致)
            lateinit var next: (data: T?) -> Unit 
            lateinit var error: (code: Int, message: String) -> Unit  
        }
        
      • 声明回调方法(要与接口提供回调功能一致)

        class ResponseCallbackListener<T> : IResponseCallback<T> {
            //通过高阶函数声明函数类型变量(参数与接口互调函数一致)
            lateinit var next: (data: T?) -> Unit 
            lateinit var error: (code: Int, message: String) -> Unit 
        
            
            //声明回调方法(与接口回调功能一致),参数为对应的函数类型变量
            fun OnNext(nextListener: (data: T?) -> Unit) {
                this.next = nextListener
            }
            fun OnError(errorListener: (code: Int, message: String) -> Unit) {
                this.error = errorListener
            }
        }
        
      • 实现接口内回调方法

        class ResponseCallbackListener<T> : IResponseCallback<T> {
          
            //通过高阶函数声明函数类型变量(参数与接口互调函数一致)
            lateinit var next: (data: T?) -> Unit 
            lateinit var error: (code: Int, message: String) -> Unit 
        
            
          
            //声明回调方法(与接口回调功能一致),参数为对应的函数类型变量
            fun OnNext(nextListener: (data: T?) -> Unit) {
                this.next = nextListener
            }
            fun OnError(errorListener: (code: Int, message: String) -> Unit) {
                this.error = errorListener
            }
          
           
            //实现接口内回调方法,调用对应函数变量的invoke(param)方法实现回调
            override fun nextFun(data: T?) {
                //函数类型的值可以通过其 invoke(……) 操作符调用:f.invoke(x) 或者直接 f(x)。
                this.next.invoke(data)  
                //this.next(data)
            }
            override fun errorFun(code: Int, message: String) {
                this.error.invoke(code, message)
            }
        }
        
  • 使用

    业务中使用

    object LoginLogicImpl {
        //声明register方法,参数为:函数类型
        fun register(callback: CallbackListenerImpl.() -> Unit) {
            var callBack = CallbackListenerImpl()   //实例化回调接口实现类
            callBack.callback()										  //将参数内的回调函数与实例化对象绑定
          
            if (true) {
                callBack.nextFun("success")            //成功回调
            } else {
                callBack.errorFun(400, "failure...")   //失败回调
            }
        }
    }
    

    外部调用

    class LoginLogicPresenter {
        fun register() {
            //调用LoginLogicImpl的register方法(可选择性显示声明回调方法)
            LoginLogicImpl.register {
                OnNext {
                    println("OnNext->$it")
                }
                //OnError { code, message ->
                //    println("OnError->$code,$message")
                //}
            }
        }
    }
    

    上面使用Kotlin的高阶函数以及Lambda表达式对普通的接口回调进行优化,并没使用object对象表达式实现了接口回调,并且不需要显示声明接口提供的所有回调方法,而是选择性的声明所需的回调方法即可。

更多Kotlin高阶函数及Lambda表达式学习地址参见《Kotlin中文社区》

【Kotlin】Kotlin的高阶函数与Lambda表达式 前言 Kotlin的高阶函数与Lambda表达式是Kotlin的特色,使用频率非常高。熟悉它的用法与本质对于简化代码、提升开发效率非常有帮助,也易于阅读kotlin的框架源码。 这两个概念并不是一个东西,但是又有非常紧密的关联。这篇文章带你弄懂什么是高阶函数,以及Lambda表达式的本质和使用。 一、什么是高阶函数 高阶函数就是将函数用作参数或返回值的函数。 函数类型 Kotlin 使用类似 (Int) -> String 的一系列函数类型来处理函数的声明,例如onClick: val onClick 阅读详情

相关推荐

Kotlin 使用高阶函数实现回调方式

主要介绍了Kotlin 使用高阶函数实现回调方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Kotlin使用接口回调的简单写法

1.Java中的接口回调实现(支持多方法回调) 声明回调接口,初始化接口 private OnClickListener onClickListener; public void setOnClickListener(OnClickListener onClickListener) { this.onClickListener = onClickListener; } interface OnClickListener { void onClick() void onIte

yuaihen的博客 4763

Kotlin 使用Lambda来设置回调的操作

使用Kotlin的Lambda表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可。 示例如下 新建一个Kotlin类 class MyBean { fun testcallback1(callback: (String) -> Unit) { callback.invoke(这是回调的内容) } fun testcallback2(value1: Int, value2: Int, callback: (Int, Int) -> Int): Int { var result = callback.invoke(value1, value2)

kotlin lambda (kotlin回调和java回调)、通用的接口以及接口默认实现

kotlin回调和java回调kotlin回调和java回调的对比kotlin的回调java的回调 kotlin回调和java回调的对比 废话不多说,人狠话不多,直接撸代码: kotlin的回调 class A{ fun setListeren(canshu1:Int,mListen: (String?) -> Unit) { //费时的操作-------后调用mListen mL...

wy313622821的博客 5694

MATLAB实战:手把手教你用三频四步相移法搞定结构光三维重建(附完整代码)

本文详细介绍了如何使用MATLAB实现三频四步相移法进行高精度结构光三维重建。通过光栅图像预处理、相位计算、多频外差与相位解包裹等步骤,结合完整代码示例,帮助读者掌握从二维图像到三维点云的关键技术。该方法在工业检测和逆向工程中具有抗干扰能力强、高分辨率和鲁棒性等优势。

weixin_29201933的博客 338

边云协同智能进化:大模型与小模型的动态训练与高效部署策略

本文深入探讨了边云协同架构下大模型与小模型的动态训练与高效部署策略。通过物流分拣、医疗影像等实战案例,展示了如何利用边云协作框架实现AI模型的智能进化,显著提升处理效率与准确性。重点解析了动态任务分配、增量学习和知识蒸馏等关键技术,为分布式训练场景提供优化方案。

work3的博客 191

android kotlin 高阶函数,Kotlin 使用高阶函数实现回调

Kotlin 使用高阶函数实现回调发布时间:2018-06-02 11:17,浏览次数:1360, 标签:Kotlin<>lambda 和 高阶函数之前学习了 lambda 和高阶函数,然后在 android 开发中对 onClick 事件进行监听是一个很常用的功能,kotlin 的常规实现如下:rootView.setOnClickListener { view -> prin...

weixin_39705435的博客 659

NHANES更新数据后,权重计算方式也更新了

官网说明在此:如果你比我还懒,我下载了几个说明文件。2021年8月至2023年8月的总样本量与之前的2年周期相似。然而,。特别是,与之前包括过度抽样的周期相比,非西班牙裔白人的样本量较高,而非西班牙裔黑人的样本量较低。此外,60岁及以上人群的样本量较高,而年轻群体的样本量较低。子组的估计值可能具有较低的精确度,因此,检测组间差异的统计能力可能较低。此外,年龄和种族/西班牙裔亚组(尤其是儿童和青少年年龄组)的估计值可能会显示意想不到的模式。

珏世佳人的博客 2410

android 接口回调用处,今天,我们细说回调

楔子苏格拉底曾说过:“不懂回调的程序员不是一个好厨子”。但对很多刚入行的朋友来说,回调确实又是一个不明觉厉的东西,理解起来稍稍有一点摸不着头脑。那么今天,笔者就以最浅显通俗的文字,带大家一起揭开回调神秘的面纱一、回调到底是个啥?根据《Java核心技术 第八版》中对回调的定义,回调(callback)是一种常见的程序设计模式。在这种模式中,可以指出某个特定事件发生时应该采取的动作。啥意思?举个例子,...

weixin_42503069的博客 398

海康威视iSC平台视频流对接:RTSP、HLS、WS三种协议到底该怎么选?

本文深入分析海康威视iSC平台视频流对接中RTSP、HLS和WebSocket三种协议的优缺点,帮助开发者根据实时性、兼容性和网络环境做出最优选择。特别适合综合安防管理平台的Web视频监控系统开发,提升用户体验和系统性能。

weixin_28365523的博客 692

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4220

Kotlin Lambda巩固

}fun a(function: Fun): String{return function(2).toString()}main() {a(b)}在这个例子中: 是一个类,代表传递了的一个函数,类似Java中的 ,像是万能类。但实际上,在Kotlin中,并没有Fun这样的、或者相似的类,来做到用一个万能类来表示任何一个函数式。而Java中,虽然有 这样的类可以进行转化,但我们平时使用的时候还是会有各种各样的转化坑(代码也很挫),所以Kotlin并没有没采取这种做法。Kotlin借鉴了Python等语言方式,

2401_84413631的博客 923

新手必看:SMIC 0.18um PDK安装保姆级教程(附Cadence IC617环境配置)

本文提供SMIC 0.18um PDK在Cadence IC617环境下的详细安装教程,涵盖环境准备、文件解压、安装脚本运行、环境变量配置及Cadence集成验证等关键步骤,特别针对初学者常见问题提供解决方案,助力快速掌握芯片设计工具配置。

weixin_30522183的博客 492

Android 之 Kotlin 回调

Kotlin提供了三种回调实现方式:1)函数类型+Lambda表达式(代码最简洁);2)高阶函数+命名函数(适合复用逻辑);3)接口模式(兼容Java风格,适合多方法回调)。相比Java,Kotlin回调优势在于减少模板代码、避免回调地狱和灵活的函数类型。协程进一步革新回调,通过suspend函数将异步操作转为同步写法,解决了嵌套回调问题。根据场景选择:简单回调用Lambda,复杂复用用高阶函数,多状态回调用接口,链式调用用协程。Kotlin通过函数式特性显著提升了异步代码的可读性。

早日成为鹏总 766

深入解析AMBA5 AXI与ACE协议:从基础到高级应用

本文深入解析了AMBA5 AXI与ACE协议的核心机制与应用。AXI协议通过分离通道、突发传输和乱序完成实现高性能数据传输,而ACE协议在此基础上构建了硬件级缓存一致性解决方案,通过监听机制和状态模型确保多核系统数据统一。文章还探讨了在异构计算等复杂场景下的实战应用与AMBA5的新特性。

cc789的博客 961

OpenClaw实战系列06:持久记忆与RAG知识库构建——让AI真正“记住”你

本文介绍了OpenClaw AI助理的持久记忆与RAG知识库构建功能。OpenClaw采用"文件即真理"的独特设计,所有记忆都以Markdown文件形式存储,支持直接编辑和Git版本管理。记忆系统分为三层:长期精炼记忆(MEMORY.md)、日常日志(按日期存储)和归档记忆。文章详细说明了环境配置步骤,包括安装必要组件、创建目录结构、设置API密钥,并提供了OpenClaw主配置文件的完整参数说明。该系统实现了跨会话、跨平台的持久化记忆,使AI助理能真正理解用户需求。

PeterPan的博客 1171

kotlin 多接口回调的实现方式(一)

没啥好说的,看标题就明白了。代码比较绕,慢慢看…. 本来想解释下代码,不过可能还在受上一篇帖子的影响吧,不知道说些什么… 有不明白的留言吧… 可以先把代码复制一份到电脑上运行一下,先看看效果 package com.example.kotlinapplication import org.junit.Test /** 多接口回调的代码测试 */ typealias Fun1 = (S...

Mr_Tony的专栏 2366

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kotlin高阶函数作为参数与Java普通接口interface等效性

Kotlin高阶函数与Java接口等效性对比摘要:演示了Kotlin高阶函数作为参数与Java普通接口的等效实现方式。通过asyncTask函数展示了两种回调处理方案:使用Lambda表达式(高阶函数)和实现ICallback接口。两种方式最终输出结果相同,表明Kotlin的高阶函数可以替代传统的接口回调模式,简化代码结构。示例包含异步任务模拟(longWork)和结果回调处理,验证了两种方式的执行流程和输出一致性。

Zhang Phil 255

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Kotlin 函数系列

本文介绍了Kotlin函数的核心知识点,包括函数基本用法、函数类型、Lambda表达式、高阶函数等特性。主要内容有:1)函数定义使用fun关键字,支持命名参数、默认参数和可变参数;2)函数类型将参数和返回值类型抽象化,支持类型别名;3)Lambda表达式简化函数写法,支持SAM转换;4)高阶函数的参数或返回值是函数类型;5)带接收者的函数类型通过this访问接收对象;6)闭包允许外部访问函数内部变量。这些特性使Kotlin函数更灵活强大。

xiangxiongfly 867

Kotlin(二) 高级函数(函数作为形参,函数作为参数)

一、概述 在JS,C 等语言中函数式的编程是很常见的,函数作为参数传递,在目标函数中再调用。很灵活简洁的编程方式。 Java不能直接用函数作为形参,只能传递对象的引用,所以在需要回调函数时,往往传递的是接口的匿名实现。 二、高阶函数 示例 高阶函数:以另一个函数作为参数,或者返回值是函数 称为 高阶函数 需要补充一些lambda的语法糖 函数作为参数:回调函数的作用,类比接口 返回...

1万+

Lambda 表达式是什么

Kotlin中的Lambda表达式是一种匿名函数,用于简化代码编写。基本结构为{参数列表 -> 函数体},常用于回调、点击事件和集合操作等场景。与普通函数相比,Lambda更简洁,能替代接口实现,减少样板代码。在Android开发中,Lambda广泛应用于事件监听、集合处理和异步回调,使代码更清晰易读。本质上,Lambda是"单一方法接口"的语法糖,既可作为参数传递,也能作为返回值。掌握Lambda能显著提升Kotlin代码的简洁性和可维护性。

琦琦的博客 348

【Kotlin】高阶函数和Lambda

Kotlin天然支持了部分函数式特性。我们可以在一个函数内部定义一个局部函数。 抽象和高阶函数 在我们以往熟悉的编程中,过程限制为只能接收数据为参数由于我们经常会遇到一些同样的程序设计模式能够用于不同的过程,比如一个包含了正整数的列表,需要对它的元素进行各种转换操作,例如对所有元素都乘以3,或者都除以2。我们就需要提供一种模式,同时接收这个列表及不同的元素操作过程,最终返回一个新的列表为了把这种类似的模式描述为相应的概念,我们就需要构造出一种更加高级的过程,表现为:接收一个或多个过程为参数,或者以一个过程作

xoliu的博客 2484

kotlin 高阶函数_Kotlin Lambda表达式,高阶函数

kotlin 高阶函数In this tutorial, we’ll be looking into kotlin higher-order functions and lambda expressions in detail. At the same time, we’ll explore function references, anonymous functions, and closure...

从零开始的教程世界 2656

Kotlin之高阶函数

高阶函数和Lambda的关系密不可分。在Lambda编程的基础知识,使用的一些与集合相关的函数式API用法,如map、filter函数等。又比如Kotlin的标准函数,如run、apply函数等,这几个函数都有一个共同的特点:他们都会传入一个Lambda表达式作为参数。像这种接收Lambda参数的函数就可以称为具有函数式编程风格的API,而如果你想定义自己的函数式API,那就需要借助高阶函数来实现了。 高阶函数的定义:如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数

ChenYiRan123456的博客 8125

Kotlin中使用高阶函数代替接口回调

Java思路实现 创建接口,创建对应抽象方法 声明接口成员变量 创建一个公共的监听方法 interface OnDialogClickListener{ fun onClickOK() } private var onDialogClickListener: OnDialogClickListener?=null fun setOnDialogClickLister(onDialogClickListener:OnDialogClickListener){

Ikulm的博客 1638
上一篇: Kotlin协程
下一篇: Android NDK—CMake配置及使用
LoadTown
博客等级 码龄14年 109粉丝 80原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值