那些隐藏在项目中的kotlin小知识,在座各位...

news2024/11/24 17:03:55

写kotlin越来越久,很多代码虽然能看懂,并且能去改,但是不知道他用了啥,里面的原理是什么,举个例子?大家一起学习一下吧

image.png

内联函数

顾名思义,但是在项目中我遇到得很少,他比较适用于一些包装方法的写法,比如下面这个

inline fun measureTimeMillis(block: () -> Unit): Long {
    val startTime = System.currentTimeMillis()
    block()
    return System.currentTimeMillis() - startTime
}

val time = measureTimeMillis {
    // code to be measured here
}
println("Time taken: $time ms")

这样的函数,以后如果想要测一段代码的运行时间,只需要将measureTimeMillis包着他就行

类型别名

一个很神奇的东西,允许为现有类型定义新名称

data class Person(val name: String, val age: Int)
typealias People = List<Person>

val people: People = listOf(
    Person("Alice", 25),
    Person("Bob", 30),
    Person("Charlie", 35)
)

fun findOlderThan(people: People, age: Int): People {
    return people.filter { it.age > age }
}

fun main() {
    val olderPeople = findOlderThan(people, 30)
    println(olderPeople)
}

其中People就是一个别名,如果使用typealias替代直接定义list,项目中就会少很多后缀为list的列表,少了类似于personlist这种变量,在搜索,全局替换,修改时也会更加直观看到person和people的区分场景

typealias可以被大量使用在list, map乃至于函数中,因为这些命名可能会比较长,替换后可以提高可读性

高阶函数

一个一开始很难理解,理解后又真香的函数,我愿称理解的那一刻为程序员进阶闪耀时,当一个老程序员回首往事时,他不会因为虚度年华而悔恨,但是一定会因为不懂高阶函数而羞耻

尤其是在项目中发现这种函数,又看不懂时,是万万不敢问同事的,所以,请现在就了解清楚吧

fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
    return operation(x, y)
}

fun main() {
    val sum = calculate(10, 5) { x, y -> x + y }
    println("Sum is $sum")

    val difference = calculate(10, 5) { x, y -> x - y }
    println("Difference is $difference")
}

可以看到,calculate其实并没有做什么,只是执行了传入进来的operation,这,就是高阶函数,所谓领导也是如此,优秀的下属,往往将方案随着问题传入进来,领导只要批示一下执行operation即可

配合上lambda原则,最后一个参数可以提出到括号外面,也就是讲operation提出到外面的{}中,交给调用方自己执行,就形成了这样的写法

    val sum = calculate(10, 5) { x, y -> x + y }

理解这一点后,一下子就清晰了很多,calculate看起来什么都没做,他却成为了世界上功能最强大,最灵活,bug最少的计算两个数运算结果的函数

深入

了解上面分析,已经足够我们在kotlin项目中进阶了,现在,我们来看下高阶函数反编译后的java代码

public final class TestKt {
   public static final int calculate(int x, int y, @NotNull Function2 operation) {
      Intrinsics.checkNotNullParameter(operation, "operation");
      return ((Number)operation.invoke(x, y)).intValue();
   }

   public static final void main() {
      int sum = calculate(10, 5, (Function2)null.INSTANCE);
      String var1 = "Sum is " + sum;
      System.out.println(var1);
      int difference = calculate(10, 5, (Function2)null.INSTANCE);
      String var2 = "Difference is " + difference;
      System.out.println(var2);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

虽然java的实现太不优雅,但是我们可以看出,高阶函数,本质上传入的函数是一个名为Function2的对象,

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

他是kotlin包自带的函数,看起来可以用来在反编译中替换匿名lambda表达式,将其逻辑移动到自身的invoke中,然后生成一个Function2对象,这样实现kotlin反编译为java时的lambda替换

这也是高阶函数得以实现的根本原因

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

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

相关文章

基于互联网下的智能配电网运维

安科瑞 华楠 摘要&#xff1a;在“互联网 ”背景下实现互联网技术和智能配电网的融合成为一种必然趋势&#xff0c;本文主要针对基于“互联网 ”的智能配电网运维技术进行分析&#xff0c;在分析我国目前智能电网运维困境和现状的基础上&#xff0c;构建基于“互联网 ”的智能配…

【域名解析】 【二级域名分发】 【vue3部署】 【腾讯云cos】 【DNSPOD】

首先注册腾讯云账号登录 先在腾讯云域名系统中购买域名并且在工信部备案 我的域名 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS 然后点击 DNSPOD DNS 解析 - 定价中心 - 腾讯云 DNSPod - 国民级 DNS 服务平台_智能DNS_免费_域名_解析_VIP_套餐 自行选择免费版…

【UE4 塔防游戏系列】09-防御塔升级、击杀敌人增加金钱

目录 效果 步骤 一、控件蓝图文本控件内容绑定金钱数 二、防御塔改造 三、击杀敌人增加金钱 四、防御塔升级功能 效果 步骤 一、控件蓝图文本控件内容绑定金钱数 1. 打开“TaFangGameMode”&#xff0c;新增一个变量命名为“PlayerMoney”&#xff0c;默认值设为2…

dp算法 力扣152乘积最大子数组

本文是Java代码&#xff01;&#xff01; 152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; 一、题目详情 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该…

【C++】STL栈和队列基本功能介绍、题目练习和模拟实现(容器适配器)

stack && queue 基本功能介绍、练习和模拟实现 前言正式开始基本函数功能三道经典栈题目讲解最小栈栈的弹出压入顺序逆波兰表达式求值 模拟实现stackqueue deque 前言 本篇基本功能不会介绍太多&#xff0c;主要是说一下STL库中的接口&#xff0c;还是在这个网站上的&…

【动态内存错误详解和C的内存分区】

常见的动态内存错误 1.动态内存错误2.经典案例分析2.1案例一2.1.1**问题分析**2.1.2**修改错误** 2.2案例二2.2.1 原因分析2.2.2 解决问题 c/c内存分布1.2 内存分区简介1.2.1 栈区(stack)1.2.2 堆区(heap)1.2.3 全局(静态)区1.2.4 常量区1.2.5 代码区 1.动态内存错误 &#xf…

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门&#xff0c;不同的系列有不同的理论依据&#xff0c;DETR的亮点在于它是完全端到端的第一个目标检测模型&#xff0c;DETR&#xff08;Detection Transformer&#xff09;是一种基于Transformer的目标检测模型&#xff0c;由Facebook A…

幼儿园门禁安全升级,其实是这么做的!

幼儿园门禁安全是确保幼儿园校园安全的重要方面。为了有效管理出入人员和防止未经授权者进入&#xff0c;幼儿园门禁系统起到了至关重要的作用。 人脸识别门禁系统作为一种先进的技术方案&#xff0c;通过准确识别个体的面部特征&#xff0c;提供了更高的安全性和便捷性。 客户…

HeidiSQL使用

​ 1、点击新建后&#xff0c;选择在根分类创建会话 2、左侧在会话名称下出现的Unnamed&#xff0c;右键选择Rename即可重命名。右侧选择数据库类型&#xff08;mysql&#xff09;&#xff0c;输入主机名&#xff08;默认本机127.0.0.1&#xff09;&#xff0c;用户名&#xff…

webpack打包之 copy-webpack-plugin

copy-webpack-plugin 打包复制文件插件。 1、什么时候要使用&#xff1f; 在离线应用中&#xff0c;前端所有文件都需在在本地&#xff0c;有些文件&#xff08;比如iconFont以及一些静态img)需要转为离线文件&#xff0c;这些文件可以直接引用更方便些&#xff0c;这就需要在打…

0基础小白自学Java“基础语法合集”,新手看这一篇就够了!!

零基础开始学习Java&#xff0c;我们应该如何入手呢&#xff1f;本文将分享以下的6点以帮助朋友们更好的学习。 1、Java注释&#xff1a; 注释是什么&#xff0c;我们为什么要学习注释&#xff1f;注释的分类?注释使用的注意事项? 注释前后对比 注释概念&#xff1a; 注释…

Python基础合集 练习28 (数值运算函数)

from this import d x -120 x的绝对值 x1 abs(x) 同时输出商和余数 y 7 y1 divmod(x1, y) print(y1) /进行幂余运算 z可以省略 (x**y)%z pow(x,y[,z]) pow(3, pow(3, 99), 10000) 四舍五入函数 d是保留小数位数&#xff0c;默认为0 round(x,[,d]) print(round…

什么是JSON

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>//编写一个JavaScript对象var obj{name:"蒋铭基",id:3,age:19}//将对象转化…

bclinux执行df命令无反应解决方法、bclinux执行df命令卡死解决方法、进程追踪strace命令说明

文章目录 说明解决方法首先排除不是系统问题验证挂载信息追踪df进程strace命令安装strace命令定位df命令卡在哪解决卡住的进程问题解决&#xff0c;验证 说明 额 今天收到反馈&#xff0c;虚拟机执行df命令卡住 卡住状态如下图 解决方法 首先排除不是系统问题 很简单&…

Ceph分布式文件系统——文件系统MDS接口 块存储RDB接口 对象存储RGW接口

创建 CephFS 文件系统 MDS 接口 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node03 2&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 systemctl status ceph…

ERROR 4: Unable to open EPSG support file gcs.csv.

报错&#xff1a; ERROR 4: Unable to open EPSG support file gcs.csv. Try setting the GDAL_DATA environment variable to point to the directory containing EPSG csv files. 解决办法&#xff1a; 将gdal编译文件的data目录设置为用户变量&#xff0c;再运行&#xff…

设计一个web服务器

完整资料进入【数字空间】查看——baidu搜索"writebug" ​ 课程设计目的 《Java&.net》是一门实践性较强的软件基础课程&#xff0c;为了学好这门课程&#xff0c;必须在掌握理论知识的同时&#xff0c;加强上机实践。本课程设计的目的就是要达到理论与实际应用…

前端实现:点击硬币实现硬币翻转动画,且动画停止时正反面随机

html: <div class"pic-box" ref"animationBox"><div class"boxes" click"handleTransform"><div class"box">// 硬币正面图片<img :class"coin1 ? img-pic : img-text" :src"coinPic&…

智能载波远程集抄系统

智能载波远程集抄系统是一种基于物联网技术的先进能源管理系统&#xff0c;它通过利用电力载波通信技术&#xff0c;实现对用户用电数据的远程抄表和监控。该系统不仅可以提高能源管理的效率和精度&#xff0c;同时还可以减少能源浪费和节省成本。 智能载波远程集抄系统主要由三…

Ceph 应用

Ceph 应用 一、创建 CephFS 文件系统 MDS 接口 1.服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 syst…