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自行定义,接口只想当一种类型
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 {@Testpublic 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的写法中,高阶函数使用特别多,甚至一些开发者把高阶当成接口回调。新手特别注意。
相关文章:
Android kotlin高阶函数与Java lambda表达式介绍与实战
一、介绍 目前在Java JDK版本的不断升高,新的表达式已开始出现,但是在Android混淆开发中,kotlin的语言与Java的语言是紧密贴合的。所以Java lambda表达式在kotlin中以新的身份出现:高阶函数与lambda表达式特别类似。接下来我讲会先…...
自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程
大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用,项目的目标是通过训练一个GRU模型…...
7.26 Qt
用QT制作一个登陆界面 运行代码 login.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类,用于输出 #include <QIcon> //图标类头文件 #include <QPushButton&…...
【MySQL】库和表的操作
目录 一、库的操作 1.1创建数据库 1.2创建数据库案例 1.3字符集和校验规则 (1)查看系统默认字符集以及校验规则 (2)查看数据库支持的字符集 (3)查看数据库支持的字符集校验规则 (4&…...
(五)RabbitMQ-进阶 死信队列、延迟队列、防丢失机制
Lison <dreamlison163.com>, v1.0.0, 2023.06.23 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制 文章目录 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制死信队列延迟队列延迟队列介绍**延迟队列_死信队列_的实现**延迟队列_插件实现下载插件RabbitMQ 配置类RabbitMQ …...
windows下面的python配置
安装包选择exe后缀的 链接:https://pan.baidu.com/s/1sTzQdHMqI4KZwyJHl79Q3w 提取码:1111 PIP安装脚本 python版本pip安装脚本下载地址n3.6https://bootstrap.pypa.io/pip/3.6/get-pip.py3.7及以上https://bootstrap.pypa.io/get-pip.py 控制面板新…...
vue3中 状态管理pinia得使用
在做项目中 vue2改造vue3项目时的vuex 发生得一些变化 vue3项目中 先看下 stores.jsimport { defineStore } from pinia 引入方法注册方法 import { getListFieldLevel } from ..api/index.jsexport const useScreenStore defineStore(screen, {state: () > ({fieldList:…...
如何使用 After Effects 导出摄像机跟踪数据到 3ds Max
推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中,我将展示如何在After Effects中跟踪实景场景,然后将相机数据导出到3ds Max。 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合…...
【iOS】懒加载
文章目录 前言一、懒加载的意义二、懒加载的原理三、懒加载优缺点 前言 iOS懒加载(Lazy Loading)是一种延迟加载的技术,它允许在需要的时候才初始化对象或执行某些操作,而不是在对象创建的时候立即执行。懒加载主要用于优化应用程…...
《脱离“一支笔、一双手、一道力扣”困境的秘诀》:突破LeetCode难题的五个关键步骤
导言: 在解决LeetCode等编程题时,不少人会陷入“一支笔、一双手、一道力扣(LeetCode)做一宿”的困境。尽管已经掌握了相关知识和算法,但在实际挑战中却无从下手。本文将分享如何摆脱这一困境的秘诀,让你在面…...
基于jeecg-boot的任务甘特图显示
更多功能看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 基于项目的任务显…...
docker export,import后无法运行,如java命令找不到,运行后容器内编码有问题
为什么用docker export呢,😔~由于客户环境太恶心了,测试一次更是麻烦,所以什么都得在本地调试完成,争取每次测试上线一次通过才行,说多了都是泪。 由于踩坑几次了,每次都忘记,且每次…...
Web3教程| 什么是地址监控?如何使用地址监控追踪黑客地址?
在当今Web3世界里,保护个人资产安全至关重要。据报道在2023年上半年,Web3领域因黑客攻击事件造成的损失高达4.794亿美元。 此外,10多个公链遭受黑客攻击,其中以太坊链遭受的损失最多,约为2.87亿美元。这些黑客的存在迫…...
flask结合mysql实现用户的添加和获取
1、数据库准备 已经安装好数据库,并且创建数据库和表 create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE TABLE admin( id int not null auto_increment primary key, username VARCHAR(16) not null, password VARCHAR(64) not null…...
阿里云服务器配置 内存,cpu等等
实例升配,https://help.aliyun.com/document_detail/25438.html?spma2c4g.11174283.6.780.2cbf4c070oeino#title-a5t-gg2-...
PHP注册、登陆、6套主页-带Thinkphp目录解析-【强撸项目】
强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册,登陆 phpStudy 设置导数据库项目目录如图:代码部分:控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…...
android Activity设置背景为半透明的时候会显示上一个activity的内容
在弹出PopupWindow时将当前Activity设置成了半透明: WindowManager.LayoutParams lp = this.activity.getWindow().getAttributes();lp.alpha = 0.5f; //0.0-1.0this...
Linux 网络收包流程
哈喽大家好,我是咸鱼 我们在跟别人网上聊天的时候,有没有想过你发送的信息是怎么传到对方的电脑上的 又或者我们在上网冲浪的时候,有没有想过 HTML 页面是怎么显示在我们的电脑屏幕上的 无论是我们跟别人聊天还是上网冲浪,其实…...
flex: 0 0 273px的意思
flex: 0 0 273px; 是一条CSS属性,用于设置flexible box布局(flexbox)中的flex子项的灵活性和尺寸。 这条属性包含三个值,分别是: flex-grow: 表示弹性增长因子,指定当有多余空间时,子项能够增长…...
helm部署rabbitmq
1.添加rabbitmq仓库并下载包 helm repo add bitnami https://charts.bitnami.com/bitnami helm pull bitnami/rabbitmq --version 10.1.4 tar -zxvf rabbitmq-10.1.4.tgz mv values.yaml values.yaml.back grep -v "#" values.yaml.back > values.yaml2.helm部署…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
