如何让你的回调更具Kotlin风味

2024-08-27 14:38
文章标签 kotlin 回调 更具 风味

本文主要是介绍如何让你的回调更具Kotlin风味,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述: 这应该是2019年的第一篇文章了,临近过年回家一个月需求是真的很多,正如康少说的那样,一年的需求几乎都在最后一两月写完了。所以写文章也搁置了很久,当然再忙每天都会刷掘金。很久就一直在使用Kotlin写项目,说实话到目前为止Kotlin用的是越来越顺手了(心里只能用美滋滋来形容了)。当然这次依然讲的是Kotlin,说下我这次需求开发中自己一些思考和实践。其中让自己感受最深的就是: “Don’t Repeat Yourself”。当你经常写一些重复性的代码,不妨停下来想下是否要去改变这样一种状态。

今天我们来讲个非常非常简单的东西,那就是回调俗称Callback, 在Android开发以及一些客户端开发中经常会使用回调。其实如果端的界面开发当做一个黑盒的话,无非就是输入和输出,输入数据,输出UI的渲染以及用户的交互事件,那么这个交互事件大多数场景会采用回调来实现。那么今天一起来说说如何让你的回调更具kotlin风味:

  • 1、Java中的回调实现
  • 2、使用Kotlin来改造Java中的回调
  • 3、进一步让你的回调更具Kotlin风味
  • 4、Object对象表达式回调和DSL回调对比
  • 5、Kotlin中回调使用建议
  • 6、Don’t Repeat Yourself(DSL回调配置太模板化了,不妨来撸个自动生成代码的AS插件吧)
  • 7、DslListenerBuilder插件基本介绍和使用
  • 8、DslListenerBuilder插件源码和Velocity模板引擎基本介绍
  • 9、总结

一、Java中的回调实现

Java中的回调一般处理步骤都是写一个接口,然后在接口中定义一些回调函数;然后再暴露一个设置回调接口的函数,传入函数实参就是回调接口的一个实例,一般情况都是以匿名对象形式存在。例如以Android中OnClickListener和TextWatcher源码为例:

  • 1、OnClickListener回调的Java实现
//OnClickListener的定义
public interface OnClickListener {void onClick(View v);
}public void setOnClickListener(OnClickListener listener) {this.clickListener = listener;
}//OnClickListener的使用
mBtnSubmit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//add your logic code}
});
  • 2、TextWatcher回调的Java实现
//TextWatcher的定义
public interface TextWatcher extends NoCopySpan {public void beforeTextChanged(CharSequence s, int start,int count, int after);public void onTextChanged(CharSequence s, int start, int before, int count);public void afterTextChanged(Editable s);
}public void addTextChangedListener(TextWatcher watcher) {if (mListeners == null) {mListeners = new ArrayList<TextWatcher>();}mListeners.add(watcher);
}//TextWatcher的使用
mEtComment.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {//add your logic code}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {//add your logic code}@Overridepublic void afterTextChanged(Editable s) {//add your logic code}
});

二、使用Kotlin来改造Java中的回调

针对上述Java中的回调写法,估计大部分人转到Kotlin后,估计会做如下处理:

1、如果接口只有一个回调函数可以直接使用lamba表达式实现回调的简写。

2、如果接口中含有多个回调函数,都会使用object对象表达式来实现的。

以改造上述代码为例:

  • 1、(只有一个回调函数简写形式)OnClickListener回调Kotlin改造
//只有一个回调函数普通简写形式: OnClickListener的使用
mBtnSubmit.setOnClickListener { view ->//add your logic code
}//针对OnClickListener监听设置Coroutine协程框架中onClick扩展函数的使用
mBtnSubmit.onClick { view ->//add your logic code
}//Coroutine协程框架: onClick的扩展函数定义
fun android.view.View.onClick(context: CoroutineContext = UI,handler: suspend CoroutineScope.(v: android.view.View?) -> Unit
) {setOnClickListener { v ->launch(context) {handler(v)}}
}
  • 2、(多个回调函数object表达式)TextWatcher回调的Kotlin改造(object对象表达式)
mEtComment.addTextChangedListener(object: TextWatcher{override fun af

这篇关于如何让你的回调更具Kotlin风味的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111952

相关文章

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

Ajax 解决回调竞争

回调的竞争,即多次快速点击同一按钮导致多个异步的AJAX请求同时返回,导致数据更新顺序混乱。这种情况在异步编程中很常见,特别是前端开发时,AJAX请求的回调并不保证按顺序执行。 $.ajaxSetup() 可以设置全局的 beforeSend 和 complete 回调函数,这样每个 AJAX 请求在发送前和完成后都可以执行相应的逻辑。 let isRequestPending = false

Kotlin高阶函数与Lambda表达式及内联函数的介绍

目录 1、高阶函数1.1、什么是高阶函数?1.1.1、不带返回值的高阶函数1.1.2、带参数且带返回值的高阶函数1.1.3、与一般的函数进行比较 1.2、如何使用?1.3、高阶函数有什么作用? 2、Lambda表达式2.1、什么是Lambda表达式?2.1.1、无参数的写法2.1.2、有参数的写法2.1.3、有参数且有返回值的写法 2.2、如何使用?2.3、Lambda表达式有什么作用? 3

Java中将函数作为参数传入方法并回调

用于记录,方便后面cv 定义方法类 import java.util.Timer;import java.util.TimerTask;import java.util.function.Function;public class Utils {public static void reqData(String url, String param,Function<String,St

android kotlin复习 Anonymous function 匿名函数

1、还是先上个图,新建kt: 2、代码: package com.jstonesoft.myapplication.testfun main(){val count = "helloworld".count()println(count);println("------------------------")var count2 = "helloworld".count(){it ==

android开发---Kotlin语言基础语法

目录 数据打印 变量 函数 程序逻辑控制   if  when 循环 数据打印 IDE采用的androidStudio 可自行官网下载 https://developer.android.google.cn/studio/archive?hl=zh-cn 新建项目 添加一个main方法,main()函数的左边出现了一个运行标志的小箭头。现在我们只要点击一下这个

【C++学习(28)】通俗一点讲解:std::bind 回调技术

std::bind 是 C++11 标准库中的一个功能,它允许你“绑定”某些参数到一个函数、成员函数或可调用对象上,从而生成一个新的可调用对象。这种新的可调用对象可以稍后被调用,而且其中一些参数已经被预先设置好了。这在回调函数和异步编程中特别有用。 下面我用一个通俗的例子来解释 std::bind 是如何工作的。 假设场景 假设你有一个家庭厨师,他有一个技能叫做“做饭”。做饭需要两个参数:一

Delphi 中三种回调函数形式解析

Delphi 支持三种形式的回调函数: 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer )。在 Delphi 中声明一般为: 1 TXXX = procedure / function (参数列表 ) ; 类的成员函数类的成员函数作为回调函数,与全局函数相比,需要关联具体的类的实例,所以它

Kotlin 范型之协变、逆变、不变

一. 前言 Kotlin 中类和类型是不一样的概念。型变是指类型转换后的继承关系。Kotlin 的型变分为逆变、协变和不变。 二. 协变 如果 A 是 B 的子类型,并且Generic<A> 也是 Generic<B> 的子类型,那么 Generic<T> 可以称之为一个协变类。 2.1Java 上界通配符<? extends T> Java 的协变通过上界通配符实现。 如果

Node.js 异步编程深度解析:回调函数、Promise 以及 async/await

Node.js 异步编程深度解析:回调函数、Promise 以及 async/await 目录 🔄 回调函数的基础与挑战💬 Promise 的使用与链式调用🚀 async/await 的简化与异常处理 🔄 回调函数的基础与挑战 回调函数的基本用法 回调函数是 Node.js 异步编程的基础,通过将函数作为参数传递给异步操作,可以在异步操作完成时执行特定的逻辑。回调函数的基