kotlin筑基(2)

文章目录

  • 一、internal
  • 二、infix
  • 三、object
  • 四、open
  • 五、operator
  • 六、sealed class
    • 1. 用法一
    • 2. 用法二
  • 七、typealias
  • 八、when
    • 1. 带参数
    • 2. 不带参数

一、internal

internal 修饰方法,表示这个方法只适合当前 module 使用,同理修饰 class 也是一样。

@Synchronized internal fun executed(call: RealCall) {runningSyncCalls.add(call)
}

二、infix

2023-7-7 11:01:19

Kotlin允许在不使用括号和点号的情况下调用函数,那么这种函数被称为 infix函数(中缀函数)。

定义 infix 函数,需要满足以下要求

  1. 它们必须是成员函数或扩展函数;
  2. 它们必须只有一个参数;
  3. 其参数不得接受可变数量的参数且不能有默认值。
class Util(val number:Int) {infix fun sum(other: Int) {println(number + other)}
}fun main(){val u = Util(5)u sum 5 //  10u sum 7 // 12
}

请注意,中缀函数总是要求指定接收者与参数。当使用中缀表示法在当前接收者上调用方法时,需要显式使用 this;不能像常规方法调用那样省略

class MyStringCollection {infix fun add(s: String) { /* …… */ }fun build() {this add "abc"   // 正确add("abc")       // 正确add "abc"        // 错误:必须指定接收者}
}

中缀函数与操作符的优先级

  1. 中缀函数调用的优先级低于算术操作符、类型转换以及 rangeTo 操作符

    1 shl 2 + 3  等价于         1 shl (2 + 3)
    0 until n * 2 等价于        0 until (n * 2)
    xs union ys as Set<*>  等价于  xs union (ys as Set<*>)
    
  2. 中缀函数调用的优先级高于布尔操作符 && 与 ||、is- 与 in- 检测以及其他一些操作符

    a && b xor c  等价于   a && (b xor c)
    a xor b in c  等价于  (a xor b) in c
    

三、object

类和对象同时创建,相当于 懒汉式单例,里面的方法是 final 方法

  1. val 变量相当于 private static final
  2. var 变量相当于 private static

kotlin中有四种方式表示静态:

  1. object单例类模式
  2. companion object
  3. JvmStatic注解模式
  4. 顶层函数模式

object:反编译java代码是由一个静态类包含一系列非静态函数

companion object:同上

JvmStatic:只能注解在单例或companion object 中的方法上,反编译java代码是一个静态函数

顶层函数:反编译java代码是一个静态函数


四、open

2023-7-7 09:51:24

在java中允许创建任意的子类并重写任意的方法,除非显示的使用了final关键字进行阻止。

而在kotlin的世界里面则不是这样,在kotlin中它所有的类默认都是 final的,那么就意味着不能被继承,而且在类中所有的方法也是默认是final的,那么就是kotlin的方法默认也不能被重写,所以open 关键字就是用来解决这个现象的。


五、operator

2023-1-16 14:00:13

operator:重载修饰符。重载运算符以达到修改原有的运算逻辑输出调用者需要的结果

常见的运算符

运算符运算重载表示
a+ba.plus(b)
a-ba.minus(b)
a*ba.times(b)
a/ba.div(b)
a%ba.rem(b) 或 a.mod(b)
a…ba.rangeTo(b)
++a, a++inc
!anot
a>ba.compareTo(b)>0
a<ba.compareTo(b)<0
a<=ba.compareTo(b)>=0
a<=ba.compareTo(b)<=0
a in bb.contains(a)
a !in b!b.contains(a)

重载plus

比如上面的 a+b,我们在使用时候除了使用这种方式还可以使用运算重载表示a.plus(b),但是需要提前定义好函数

// 一定要使用 operator 修饰 plus 函数,否则无法使用 + 号
class My(val a:Int){operator fun plus(b:Int):Int{return a*b // 也可以使用 a.times(b) --> kotlin默认运算符重载表示(Primitives.kt)}
}// 使用
fun main(){val a = My(3)val plus = a.plus(3)val i = a + 4println(i)println(plus) // 输出// 12, 9
}

重载get

operator除了可以重载运算符号,还可以重载get

class My(val a:Int){val arr = mutableListOf(1,2,3,4)operator fun get(index:Int):Int{return arr[index+1]}
}
// 使用
fun main(){val a = My(3)val get = a.get(0)// 也可以是 val get = a[0]println(get)// 输出 2
}

六、sealed class

2023-7-19 16:54:58

sealed class,密封类。具备最重要的一个特点:

其子类可以出现在定义 sealed class 的不同文件中,但不允许出现在不同的 module 中,且需要保证 package 一致。这样既可以避免 sealed class 文件过于庞大,又可以确保第三方库无法扩展你定义的 sealed class,达到限制类的扩展目的。

1. 用法一

是一个有特定数量子类的类,看上去和枚举有点类似。

 // TestSealed.ktsealed class GameAction(times: Int) {// Inner of Sealed Classobject Start : GameAction(1)data class AutoTick(val time: Int) : GameAction(2)class Exit : GameAction(3)}//与内部类的创建一样
fun main(args:Array<String>){var sc:GameAction = GameAction.Start()
}

2. 用法二

2023-11-21 星期二

可以实现普通类无法实现的 条件判断语句

sealed class Result
class Success(val code: Int) : Result()
class Exception(val code: Int, val message: String) : Result()fun handleResult(result: Result): String{return when(result) {is Success -> {"success"}is Exception -> {"exception"}}
}

反编译后的java代码,Result 类其实是一个抽象类,SuccessException 继承了这个抽象类。Result 类的构造函数是私有的,不能在外部访问到。

通过继承这个抽象类,达到限制类型的做法。

这其实和 java 中使用接口来限定参数类型的做法类似,很好理解。


七、typealias

2023-10-27 20:34:13

别名。和 import as 很像,但两者使用范围有差别,具体查看链接。

  • typealias 只能定义在顶层位置,不能被内嵌在类、接口、函数等内部(import as)。

kotlin中的别名:

@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>

多数通用场景:

// Classes and Interfaces (类和接口)
typealias RegularExpression = String
typealias IntentData = Parcelable// Nullable types (可空类型)
typealias MaybeString = String?// Generics with Type Parameters (类型参数泛型)
typealias MultivaluedMap<K, V> = HashMap<K, List<V>>
typealias Lookup<T> = HashMap<T, T>// Generics with Concrete Type Arguments (混合类型参数泛型)
typealias Users = ArrayList<User>// Type Projections (类型投影)
typealias Strings = Array<out String>
typealias OutArray<T> = Array<out T>
typealias AnyIterable = Iterable<*>// Objects (including Companion Objects) (对象,包括伴生对象)
typealias RegexUtil = Regex.Companion// Function Types (函数类型)
typealias ClickHandler = (View) -> Unit// Lambda with Receiver (带接收者的Lambda)
typealias IntentInitializer = Intent.() -> Unit// Nested Classes and Interfaces (嵌套类和接口)
typealias NotificationBuilder = NotificationCompat.Builder
typealias OnPermissionResult = ActivityCompat.OnRequestPermissionsResultCallback// Enums (枚举类)
typealias Direction = kotlin.io.FileWalkDirection
// (but you cannot alias a single enum *entry*)// Annotation (注解)
typealias Multifile = JvmMultifileClass

八、when

2024-1-5 16:46:17 星期五

1. 带参数

fun mix(color1: ColorEnum, color2: ColorEnum) =when(setOf<ColorEnum>(color1, color2)){setOf(ColorEnum.RED, ColorEnum.GREEN) -> "黄色"setOf(ColorEnum.RED, ColorEnum.BLUE) -> "紫色"setOf(ColorEnum.BLUE, ColorEnum.GREEN) -> "黑色"else -> throw Exception("不知道什么颜色")
}

2. 不带参数

带参数的会好理解一些,根据when的条件去做判断,最终给出符合条件的输出。但是不带参数的,我们做了验证,结果如下:谁先成立执行谁,并跳出判断。

class CustomBean{val conditon1=trueval conditon2=trueval conditon3=false
}fun main(){val cb = CustomBean()when{cb.conditon1-> l2.i("Splash","conditon1")cb.conditon2-> l2.i("Splash","conditon2")else-> l2.i("Splash","else")}  
}/*输出:
conditon1
*/

看下反编译后的java代码,所以相当于 if else ,谁先成立执行谁,并跳出判断。

public static void main(String[]args){CustomBean cb = new CustomBean();if (cb.getConditon1()) {l2.i("Splash", "conditon1");} else if (cb.getConditon2()) {l2.i("Splash", "conditon2");} else {l2.i("Splash", "else");}
}

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

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

相关文章

mysql的time_zone导致性能下降

mysql的 time_zone有哪些 MySQL 的 time_zone 变量可以设置为多种不同的时区值。这些值通常由字母和数字组成&#xff0c;代表世界上不同的地理区域和它们的标准时间。以下是一些常见的 time_zone 设置选项&#xff1a; UTC&#xff1a;协调世界时&#xff0c;是国际标准时间…

2024年3月ZZUACM 招新赛题解

2024年3月ZZUACM 招新赛 题号题目A区间次大值B上课签到C魔法森林&#xff08;一&#xff09;D魔法森林&#xff08;二&#xff09;ELOPF跳格子G猜数字H抽卡记录I安达的二维矩阵J安达的数字手术K跳楼梯L前缀和 A 区间次大值—循环/签到题 题目描述 给定一个 n n n的全排列 a i…

顶顶通呼叫中心中间件(基于FreeSWITCH)对接mrcp asr 和 tts配置

介绍 顶顶通呼叫中心中间件通过asrproxy程序对接各种asr和tts,本文主要讲解 asrproxy程序 对接 mrcp v1 和 mrcp v2的配置。 asrproxy.json配置 asr配置 "asr":{"interface": {"mrcp": {"count": 0,"fault_threshold": 0…

外包干了10天,技术退步明显···

先说一下自己的情况&#xff0c;本科生&#xff0c;通过校招进入杭州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&…

【鸿蒙开发】第十七章 Web组件(一)

1 Web概述 Web组件用于在应用程序中显示Web页面内容&#xff0c;为开发者提供页面加载、页面交互、页面调试等能力。 页面加载&#xff1a;Web组件提供基础的前端页面加载的能力&#xff0c;包括&#xff1a;加载网络页面、本地页面、html格式文本数据。 页面交互&#xff1a…

Java必须掌握的clear【】(含面试大厂题和源码)

面试题&#xff1a;“如何在Java中清除一个数组中的所有元素&#xff1f;” 在Java中&#xff0c;清除一个数组中的所有元素并不意味着逐个删除数组的每个元素&#xff0c;因为这在数组中是不可能做到的。数组的大小在初始化之后是固定的&#xff0c;无法改变。因此&#xff0…

IOS面试题object-c 1-10

1、简述Object-C的理解与特性&#xff1f; OC 作为一门 面向对象 的语言&#xff0c;自然具有面向对象的语言特性&#xff1a;封装、继承、多态。 它既具有 静态语言的特性&#xff08;如C&#xff09;&#xff0c;又有 动态语言的效率&#xff08;动态绑定、动态加载等&#…

JAVA使用的工具类-Hutool

文章目录 Hutool工具类简介1&#xff1a;身份证工具类相关方法1.1 身份证脱敏处理 字符串补零处理(此处是JAVA类的方法&#xff0c;并无引用StrUtil)springboot前后端分离&#xff0c;后端返回json字符串带斜杠问题处理 在这里整理一下博主常用的工具类方法-hutool工具类,这里囊…

制定一份完美的测试计划,让您的产品质量更上一层楼!

大家好&#xff0c;我是彭于晏。今天学习测试计划如何书写。 虽然很多人日常工作中都知道测试计划是什么&#xff0c;但是写好测试计划&#xff0c;其实并不容易。今天就来一起学习下测试计划如何书写。 什么是测试计划&#xff1f; 测试计划是一份为软件产品所准备的详细文档…

目标检测——监控下打架检测数据集

一、简述 首先&#xff0c;监控下打架检测是维护公共安全的重要手段。在公共场所、学校、监狱等地方&#xff0c;打架事件往往难以避免。通过安装打架检测监控系统&#xff0c;可以实时监控并准确识别打架事件&#xff0c;及时采取必要的应对措施&#xff0c;有效地减少打架事…

RNN预测正弦时间点

import torch.nn as nn import torch import numpy as np import matplotlib matplotlib.use(TkAgg) from matplotlib import pyplot as plt # net nn.RNN(100,10) #100个单词&#xff0c;每个单词10个维度 # print(net._parameters.keys()) #序列时间点预测num_time_steps 50…

消息中间件面试题-参考回答

面试官&#xff1a;RabbitMQ-如何保证消息不丢失 候选人&#xff1a; 嗯&#xff01;我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步 的&#xff0c;这里面就要求了消息的高可用性&#xff0c;我们要保证消息的不丢失。主要从三 个层面考虑 第一个是开启生产者…

学习SVN

学习SVN 摘要1.简介2.下载安装3.SVN生命周期4.SVN Server搭建5.SVN Client使用6.git与SVN的区别 SVN 官网 Github SVN 源码 摘要 本篇博客对SVN的基础使用进行总结&#xff0c;以便加深理解和记忆 1.简介 SVN是Apache Subversion的缩写&#xff0c;是一个开源的源码版本控制…

java-ssm-jsp-基于ssm的宝文理学生社团管理系统

java-ssm-jsp-基于ssm的宝文理学生社团管理系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

应对高并发的软件架构之道

在去年年终总结的时候&#xff0c;我提出了这样的困惑&#xff0c;究竟什么是真正的技术能力&#xff0c;是对于各种底层技术的钻研吗&#xff1f;钻研是好事&#xff0c;但实践下来&#xff0c;深入钻研并不在实际工作中有用&#xff0c;且钻研的越深&#xff0c;忘得越快&…

AIGC安全研究简述(附资料下载)

2023 AIGC技术实践及展望资料合集&#xff08;29份&#xff09;.zip 2023 AIGC大型语言模型(LLM)实例代码合集.zip 2023大模型与AIGC峰会&#xff08;公开&#xff09;PPT汇总&#xff08;25份&#xff09;.zip AIGC的安全研究是一个复杂且重要的领域&#xff0c;涉及多个关键…

Leetcode : 1137. 高度检查器

学校打算为全体学生拍一张年度纪念照。根据要求&#xff0c;学生需要按照 非递减 的高度顺序排成一行。 排序后的高度情况用整数数组 expected 表示&#xff0c;其中 expected[i] 是预计排在这一行中第 i 位的学生的高度&#xff08;下标从 0 开始&#xff09;。 给你一个整数…

一篇搞懂什么是LRU缓存|一篇搞懂LRU缓存的实现|LRUCache详解和实现

LRUCache 文章目录 LRUCache前言项目代码仓库什么时候会用到缓存(Cache)缓存满了&#xff0c;怎么办&#xff1f;什么是LRUCacheLRUCache的实现LRUCache对应的OJ题实现LRUCache对应的STL风格实现 前言 这里分享我的一些博客专栏&#xff0c;都是干货满满的。 手撕数据结构专栏…

什么是测试用例?如何设计?

在学习或者实际的测试工作中经常都会提到“测试用例”这个词&#xff0c;没错&#xff0c;测试用例是测试工作的核心&#xff0c;不管要做的是什么样的测试&#xff0c;在真正动手执行测试之前&#xff0c;我们都需要先根据软件需求来设计测试用例&#xff0c;之后再依据设计好…

动态加权平衡损失:深度神经网络的类不平衡学习和置信度校准

系列文章目录 文章目录 系列文章目录前言一、研究目的二、研究方法创新点处理类不平衡的大多数方法交叉熵损失函数Brier Score 三、DWB Loss总结 前言 Dynamically Weighted Balanced Loss: ClassImbalanced Learning and Confidence Calibration of Deep Neural Networks 下载…