Java与Kotline Funcation函数与参数函数的详解

一.介绍

        在现在以IDE为开发工具的时代,各种开发语言都有,kotlin的语法势头比较强,今天我们将介绍在项目中出现比较多的两种函数,一种是参数函数,还有一种就是Function函数

如果你不了匿名函数请阅读以下文档:

Android kotlin高阶函数与Java lambda表达式介绍与实战_蜗牛、Z的博客-CSDN博客

二.参数函数

        正常在Java中,如果想回调另一个方法或者类中的数据,可以通过接口回调,但是在kotlin语法中,有一种新的定义:参数函数,也叫接口参数

格式

方法名:((参数类型1,参数类型2)->返回值类型)

    var add: ((Int, Int) -> Int)? = nullvar printlog: ((String) -> Unit)? = null
解释:

其实这个很简单,和方法参数一样,只是通过()t给括起来了,如果还不了解方法参数可以参考:

Android kotlin高阶函数与Java lambda表达式介绍与实战_蜗牛、Z的博客-CSDN博客

将匿名函数变成一个函数对象,其他按对象定义变量一样使用。方法中也一样定义

方法传参:

   fun setCallback(function: ((Int, Int) -> Int)?) {add = function}fun  setLogCallback(block: ((String) -> Unit)?){printlog=block}

如何调用?

这是方法,所以调用格式也是参考方法

   public fun operation() {val rsult = add!!(3, 4)printlog!!("${rsult}")Log.log(rsult)}

完整类如下:

class MyFunction {var add: ((Int, Int) -> Int)? = nullvar printlog: ((String) -> Unit)? = nullfun setCallback(function: ((Int, Int) -> Int)?) {add = function}fun  setLogCallback(block: ((String) -> Unit)?){printlog=block}public fun operation() {val rsult = add!!(3, 4)printlog!!("${rsult}")Log.log(rsult)}}

三.如何使用

        使用又分为两种,kotlin的自身调用,和Java的混合调用,但是kotlin的调用又有两种方式,且与普通的函数又不同,Java的调用需要Function函数参数。

在Kotllin中的调用

   val function = MyFunction()function.setCallback(function = { x, y ->x + y})function.setLogCallback(block = {Log.log(it)})function.setCallback { x, y -> x+y  }

如果你是直接通过方法调用,如果函数定义了什么参数名,你也要使用相同的,我这里声明了function和block两个,所以直接function={}和block={},里面跟上变量

匿名: function.setCallback { }

直接在方法通过{}来扩展。

Java调用:

java的调用要借助与kotlin中的Funtion函数,Function是interface类型

public interface Function1<in P1, out R> : Function<R> {/** Invokes the function with the specified argument. */public operator fun invoke(p1: P1): R
}

通过源码可以看出,invoke()就是方法,了解过反射的朋友都知道,这种写法很像hook的风格,通过源码分析也能看出,定义了两个Function,kotlin会根据你的变量多少,映射到对应得function类上,目前系统最多支持22个参数,也就是Function22这个类。

 

Java中的new:

 

   public void fun(){MyFunction function=new MyFunction();function.setCallback(new Function2<Integer, Integer, Integer>() {@Overridepublic Integer invoke(Integer integer, Integer integer2) {return null;}});}

注意:Java在与kotlin混合开发,无法支持匿名函数写法,无法用过
function.setCallback(){}这种写法IDE会提示出错。

四.Function的总结

        Function是接口类型,目前最多支持22个参数,这个类目前用的最多就是Java与kotlin的混合写,当然你也可以当接口调用。它的功能和我们在kotlin中定义的参数函数是一个道理。所以kotlin在编译成Java文件时,会自动生成对应得function,这样便于Java在混合的调用

五.总结

1、通过以上的分析,我们了解了Function函数的特色以及为什么会有Function函数,最多支持多大参数。以及匿名参数函数的调用与声明。

2、这些在开发过程中属于比较常见的开发技巧,使用率特别高,免去了接口的定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/22315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISC 2023︱诚邀您参与赛宁“安全验证评估”论坛

​​8月9日-10日&#xff0c;第十一届互联网安全大会&#xff08;简称ISC 2023&#xff09;将在北京国家会议中心举办。本次大会以“安全即服务&#xff0c;开启人工智能时代数字安全新范式”为主题&#xff0c;打造全球首场AI数字安全峰会&#xff0c;赋予安全即服务新时代内涵…

【华为OD机试】数字最低位排序【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号…

常见的设计模式(超详细)

文章目录 单例模式饿汉式单例模式懒汉式单例模式双重检索单例模式 工厂模式简单工厂模式工厂&#xff08;方法&#xff09;模式抽象工厂模式 原型模式代理模式 单例模式 确保一个类只有一个实例&#xff0c;并且自行实例化并向整个系统提供这个实例。 饿汉式单例模式 饿汉式单…

【Vue】全家桶介绍

文章目录 概述核心Vue.Js浏览器开发插件vue-devtools项目构建工具&#xff1a;vue-cli路由管理器 &#xff1a; vue-Router状态管理模式&#xff1a;vuex网络请求库&#xff1a;AxiosUI框架&#xff1a; iview、vant、elementUI打包工具&#xff1a; webpack来源 概述 Vue全家…

编程导航算法村第七关 |二叉树的遍历

编程导航算法村第七关 | 二叉树的遍历 前序遍历&#xff08;递归&#xff09; public List<Integer> preorderTraversal(TreeNode root) {ArrayList<Integer> result new ArrayList<Integer>();preorder(root, result);return result;}public void preorde…

关于win11 debian wsl 子系统安装启动docker一直starting,无法启动

首先我先说明&#xff0c;我的步骤都是按照官网步骤来的 通过官网的操作步骤 通过测试命令 sudo docker run hello-world得到下面的命令&#xff0c;我们通过启动命令 sudo service docker start 执行结果如下图 也就是说无法启动&#xff0c;一直显示在启动中 遇到这种情况…

js实现轮播图(手动+自动)

目录 设置大体样式 图片播放 完整代码 设置大体样式 <input type"button" value"<" id"pre" onclick"pre()" onmouseover"stop()" onmouseout"start()" class"left"> <img src"..…

大数据教材推荐|Python数据挖掘入门、进阶与案例分析

主 编&#xff1a; 卢滔&#xff0c;张良均&#xff0c;戴浩&#xff0c;李曼&#xff0c;陈四德 出版社&#xff1a; 机械工业出版社 内容提要 本书从实践出发&#xff0c;结合11个“泰迪杯”官方推出的赛题&#xff0c;按照赛题的难易程度进行排序&#xff0c;由浅入深…

Python(六十四)字典元素的遍历

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

HTTP 协议 版本详解

HTTP 协议 介绍<一> 简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在客户端和服务器之间进行通信的协议。它是现代互联网中最常用的应用层协议之一。HTTP 的主要目的是实现超文本资源的传输&#xff0c;例如 HTML 文档、图像和音频文件等。…

uniapp开发支付宝小程序下拉刷新错误解决方法

文件 pages.json "globalStyle": {"...","mp-alipay": {"allowsBounceVertical": "YES"}} {"path": "rechargeRecord/rechargeRecord","style": {"navigationBarTitleText": &quo…

JMeter 的使用

文章目录 1. JMeter下载2. JMeter的使用2.1 JMeter中文设置2.2 JMeter的使用2.2.1 创建线程组2.2.2 HTTP请求2.2.3 监听器 1. JMeter下载 官网地址 https://jmeter.apache.org/download_jmeter.cgi https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.zip 下载解…

Cesium 工程模板

1、vue2.x cli https://github.com/948033145/anov-gis-vue2 2、vue3.x vite https://github.com/948033145/anov-gis-vite 下载代码 anov-gis-vue2.x.zip 下载代码 anov-gis-vite.zip

一文学会git常用命令和使用指南

文章目录 0. 前言1.分支分类和管理1. 分支分类规范&#xff1a;2. 最佳实践3. 分支命名规范示例&#xff1a;4. 分支管理方法&#xff1a; 2. commit 注释规范1. 提交注释结构&#xff1a;2. 提交注释的准则&#xff1a; 3. git 常用命令1. git pull 核心用法2. git push 命令1…

SpringCloud《Eureka、Ribbon、Feign、Hystrix、Zuul》作用简单介绍

概述 SpringCloud是一个全家桶&#xff0c;包含多个组件。 本文主要介绍几个重要组件&#xff0c;也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。 一、业务场景介绍 业务流程&#xff0c;支付订单功能 订单服务改变为已支付订单服务调用库存服务&#xff0c;扣减…

用于视觉跟踪的在线特征选择研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Docker实战-关于Docker镜像的相关操作(二)

导语   之前的分享中&#xff0c;我们介绍了关于Docker镜像的查询操作相关的内容&#xff0c;下面我们继续来介绍删除清理、导入导出、创建镜像等操作。 如何删除和清理镜像&#xff1f; 使用标签删除镜像 可以使用docker rmi 或者是 docker image rm 命令来删除镜像&#x…

【phaser微信抖音小游戏开发005】画布上添加图片

特别注意&#xff1a;真机模拟的时候&#xff0c;尽量使用网络图片资源&#xff0c;不要在小程序源文件里面使用图片&#xff0c;会出现真机加载不成功&#xff0c;小程序包体积过大的问题。我们学习过程中&#xff0c;只是作为演示使用。 推荐使用场景&#xff1a; 背景图片…

Redis 和 Mysql 如何保证数据一致性

项目场景&#xff1a; 一般情况下&#xff0c;Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据库 IO&#xff0c;还可以提升数据的 IO 性能。 如下图所示&#xff0c;这是它的整体架构。 当应用程序需要去读取某个数据的时候&#xff0c;首先会先…

时序数据库 TDengine 与 WhaleStudio 完成相互兼容性测试认证

近年来&#xff0c;开源及其价值获得社会各界的广泛认可&#xff0c;无论是国家政策导向还是企业数字化转型&#xff0c;都在加速拥抱开源。对于如操作系统、数据库等基础软件来说&#xff0c;开源更是成为驱动技术创新的有力途径。 在此背景下&#xff0c;近日&#xff0c;涛…