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

避开CPU瓶颈:手把手教你用RK3588的DMA-BUF实现V4L2到NPU的零拷贝数据流

本文详细介绍了如何在RK3588平台上利用DMA-BUF实现V4L2到NPU的零拷贝数据流,显著提升异构计算性能。通过实战指南展示了如何配置摄像头采集、RGA图像预处理和NPU推理优化,最终实现CPU占用率降低60%、延迟减少60%的效果,特别适合YOLOv5等AI推理应用的高效部署。

weixin_30374009的博客 571

Multisim14.3中FPGA接口电路设计:原理图项目应用

深入讲解在multisim14.3环境下构建FPGA接口电路的方法,结合原理图设计与项目实践,展现multisim14.3强大的电路仿真能力,提升数字系统开发效率。

weixin_42578963的博客 1157

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

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

weixin_39705435的博客 659

SOPHGO SG2000/SG2002 AI SoC异构架构解析与应用

异构计算架构通过整合不同指令集核心(如RISC-V、Arm和8051)实现性能与功耗的平衡,是现代嵌入式系统和AIoT设备的关键技术。其原理是根据任务特性分配至最适合的计算单元,例如通用计算使用高性能核心,实时任务交由专用核心处理。这种架构在智能视觉、工业检测等场景具有显著优势,能高效处理AI推理、多媒体编解码等任务。SOPHGO SG2000系列SoC采用创新的三核异构设计,集成了0.5-1TOPS的NPU加速器,支持Linux/Android/FreeRTOS多系统并行运行。开发中需注意核心间的IPC通

weixin_30684743的博客 353

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

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

weixin_42503069的博客 398

【软件分享】天若OCR文字识别V4.48(翻译功能免费)

软件简介 吾爱破解论坛大佬天若幽心开发的一款OCR文字识别工具。支持快速截图识别,以及文本翻译。 下载地址 蓝奏云盘:点击下载 百度网盘:点击下载(密码:4dm4) 坚果云盘:点击下载 天翼云盘:点击下载 微软云盘:点击下载 使用教程 1、下载后对压缩包进行解压 2、双击天若OCR文字识别.exe 3、发现桌面右下角出现软件图标 4、双击软件图标即可开始截图识别 原帖地址 https://www.52pojie.cn/thread-692917-1-1.html ...

XavierJ的博客 1万+

域自适应的理解与想法(Domain Adaptation)

这幅图是域适应非常有名的一篇论文中的插图,被很多文章转载。 什么是领域自适应? Domain Adaptation是迁移学习中很重要的一部分内容,目的是把分布不同的源域和目标域的数据,映射到一个特征空间中,使其在该空间中的距离尽可能近。于是在特征空间中对source domain训练的目标函数,就可以迁移到target domain上,提高target domain上的准确率。 上面的图主要的思想来源于GAN,上图由三部分组成:特征映射网络 标签分类网络和和域判别网络 其中,source domain的数.

yuanxue18的博客 5982

Kotlin Lambda巩固

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

2401_84413631的博客 923

3. NVIDIA GPU Xid 常见错误码全解析、故障定位与标准化处理方案

摘要: Xid是NVIDIA显卡驱动记录的硬件/软件异常日志,通过dmesg等工具可获取,包含PCI总线、GPU编号、故障码等信息,是诊断显卡问题的核心依据。Xid故障分为四类:应用程序类(如代码错误,Xid13/31)、显存ECC硬件类(如显存损坏,Xid48/63)、链路/供电温控类(如PCIe故障,Xid74/79)和GSP固件类(如静电干扰,Xid119/154)。排查流程包括日志采集、软件修复(如重启进程、升级驱动)、硬件检查(如PCIe链路状态)及断电复位(针对GSP故障)。预防措施包括监控EC

jundao1997的专栏 674

Android 之 Kotlin 回调

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

早日成为鹏总 766

【Claude Code 源码解析教程】第4章:QueryEngine 查询引擎

本章深入解析 Claude Code 的核心引擎——QueryEngine,它是整个对话系统的"心脏",负责管理会话状态、消息处理流程和多轮对话支持。

rengang66的博客 269

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 718

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

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

Mr_Tony的专栏 2366

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

Zhang Phil 255

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Kotlin 函数系列

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

xiangxiongfly 867

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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、付费专栏及课程。

余额充值