
Kotlin入门与进阶
文章平均质量分 80
Kotlin入门与进阶
GitLqr
A Little White Developer
展开
-
Kotlin - 改良装饰者模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言装饰者模式作用:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。本质:该模式通过创建一个包装对象,来包裹真实的对象。核心操作:创建一个装饰类,包含一个被装饰类的实例装饰类重写所有被装饰类的.原创 2022-05-28 10:44:04 · 368 阅读 · 0 评论 -
Kotlin - 改良责任链模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言责任链模式作用:避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。举例:OKHttp 的拦截器、Servlet 中的 FilterChain二.原创 2022-05-22 22:10:14 · 703 阅读 · 0 评论 -
Kotlin - 改良迭代器模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言迭代器模式作用:将遍历和实现分离开来,在遍历的同时不需要暴露对象的内部表示举例:ArrayList、LinkedList、TreeSet 均可通过 iterator() 方法获取到迭代器对元素进行遍历,不需要关心.原创 2022-05-08 19:17:58 · 834 阅读 · 0 评论 -
Kotlin - 改良策略模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言策略模式作用:让算法的变化独立于使用算法的客户核心操作:定义了算法族,分别封装起来,让它们之间可以相互替换二、使用策略模式例子:游泳运动员的游泳姿势重点:算法抽离,封装成策略作为一个游泳运动员,.原创 2022-05-04 19:55:56 · 904 阅读 · 0 评论 -
Kotlin - 改良观察者模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言观察者模式作用:定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。核心操作:观察者(订阅者)添加或删除.原创 2022-03-13 22:24:21 · 3833 阅读 · 0 评论 -
Kotlin - 改良构建者模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言构建者模式作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。核心操作:私有化复杂对象(Product)的类构造器,设计并创建 Builder 类。二、使用构建者模式例子:.原创 2022-03-06 20:18:20 · 2501 阅读 · 1 评论 -
Kotlin - 改良工厂模式
欢迎关注微信公众号:FSA全栈行动 👋Kotlin - 改良工厂模式Kotlin - 改良构建者模式Kotlin - 改良观察者模式Kotlin - 改良策略模式Kotlin - 改良迭代器模式Kotlin - 改良责任链模式Kotlin - 改良装饰者模式一、前言设计模式是软件工程中解决特定问题的一种指南,我们常说 Java 有 23 种设计模式,而多范式的 Kotlin 作为更好的 Java,拥有很多新的语言特性,在使用原本 Java 中常用的设计模式时,可以有哪些方面的改良呢.原创 2022-02-27 23:26:45 · 2694 阅读 · 0 评论 -
Kotlin - 函数式编程
函数式编程什么是函数式编程,以下是维基百科给出的答案:函数式编程(英语:functional programming)或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ 演算(lambda calculus)为该语言最重要的基础。而且,λ 演算的函数可以接受函数当作输入(引数)和输出(传出值)。比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂原创 2021-02-19 22:21:23 · 492 阅读 · 0 评论 -
Kotlin - 尾递归优化
尾递归尾递归就是函数在调用完自己之后没有其他操作的递归,是递归的一种特殊形式。举个例子,"计算斐波那契数列第 n 项"的递归算法有哪些?简单递归实现斐波那契数列第 0、1 位都是 1,从第二位开始,每项是前两位之和,因此用递归算法很容易就能实现出来了:fun fib1(n: Int): Int { if (n == 0 || n == 1) return 1 return fib1(n - 1) + fib1(n - 2);}这种写法虽然递归调用是在方法的最后一行,但其实这里还原创 2021-02-19 22:20:10 · 379 阅读 · 0 评论 -
Kotlin - 作用域函数
作用域函数Kotlin 提供了一系列的作用域函数,可以在函数形成的临时作用域中对象上下文执行代码块,这些作用域函数共有 5 个:let、with、run、apply、also,它们区别有 2 个:对象上下文在作用域名中的使用(this 还是 it)作用域函数的返回结果(上下文对象 还是 Lambda 表达式结果)letlet 经常用于非空值执行代码块,通过与安全操作符 ? 组合成 ?.let 进行安全的非空代码操作:对象上下文:it返回值:lambda 表达式结果fun main(a原创 2021-02-19 22:18:35 · 206 阅读 · 0 评论 -
Kotlin - 常见高阶函数
forEach高阶函数 forEach 是可迭代对象的扩展方法,接收函数类型是 (T) -> Unit 的参数 action,forEach 会将 action 这个函数作用于可迭代对象中的每个元素,这是源码:/** * Performs the given [action] on each element. */@kotlin.internal.HidesMemberspublic inline fun <T> Iterable<T>.forEach(action原创 2021-02-19 22:17:22 · 583 阅读 · 0 评论 -
Kotlin - 高阶函数与函数引用
高阶函数高阶函数是 参数或返回值是函数 的函数,我们之前已经接触过了几个高阶函数,如:// _Arrays.ktpublic inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element)}public inline fun <T> Array<out T>.filter(predicate: (原创 2021-02-19 22:16:03 · 467 阅读 · 0 评论 -
Kotlin - 枚举与密封类
枚举Kotlin 支持枚举,需要使用 enum class 进行声明,如:enum class LogLevel { VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT}上面的代码可以理解为是 LogLevel 类的 companion object 语法糖:class LogLevel private constructor() { companion object { val VERBOSE = LogLevel()原创 2021-02-19 22:14:24 · 426 阅读 · 0 评论 -
Kotlin - 内部类
内部类内部类就是定义在类内部的类,Kotlin 中的内部类大致分为 2 种:静态内部类非静态内部类静态内部类在某个类中像普通类一样声明即可,可以认为静态内部类与外部类没有关系,只是定义在了外部类"体内"而已,在使用静态内部类时需要"带上"外部类:class Outer { val a: Int = 0 class Inner { val a: Int = 5 }}fun main() { val outer = Outer()原创 2021-02-19 22:12:28 · 4506 阅读 · 0 评论 -
Kotlin - 数据类
componentN 方法大前端 es6 中有一个解构的语法特性我很是喜欢,通过类似 let {name,isCheck} = option 的写法就可以从 option 对象中提取出 name 和 isCheck 属性,而不再是使用 let name = option.name 这种写法,解构的语法让代码得以更进一步的简化,那么作为后起之秀的 Kotlin 是否也有这种特性呢?没错,Kotlin 也有(注意:两者还是有区别的),它就是 componentN 方法 ,我们直接来看代码:class Use原创 2021-02-19 22:10:35 · 283 阅读 · 0 评论 -
Kotlin - 属性代理
自定义属性代理代理也叫委托,Kotlin 支持属性代理,把一个属性的获取与赋值交给一个“中介”(下称 Delegate)去管理,属性代理的语法是: val/var <属性名>: <类型> by <表达式> ,by 后面是 Delegate 对象,被代理属性的 get()和 set() 会给 Delegate 对象对应的 getValue() 和 setValue() 分别代理,因此 Delegete 可以这么写:注意:Delegate 并不需要实现任何接口,仅需提供原创 2021-02-19 22:08:41 · 622 阅读 · 0 评论 -
Kotlin - 扩展成员
扩展方法Kotlin 中支持在不修改类原本结构的前提下,对类功能进行扩展,比如对 String 类新增一个 multiply()方法,可返回重复 n 次的字符串:fun String.multiply(time: Int): String { val stringBuilder = StringBuilder() for (i in 0 until time) stringBuilder.append(this) return stringBuilder.toString()}原创 2021-01-30 22:24:42 · 325 阅读 · 2 评论 -
Kotlin - 方法重载与默认参数
方法重载(Overloads)当一个类中有两个或多个具有相同方法名和不同的参数类型的方法时,就是重载:class Person { fun say() { println("hahaha") } fun say(what: String) { println(what) } fun say(obj: Any) { println("this is ${obj.javaClass.simpleName}") }原创 2021-01-30 22:22:59 · 773 阅读 · 0 评论 -
Kotlin - 伴生对象与静态成员
object 关键字Kotlin 中有一种特殊的类,它本身也是一个实例(单例),这种既是类又是对象的类需要使用 object 关键字声明(普通类声明使用 class),它跟普通类一样,也可以实现接口和继承父类:object MusicPlayer : Player(), OnStatusChangeListener { var state: Int = 0 fun play(url: String) { ... } fun stop() {原创 2021-01-30 22:20:50 · 330 阅读 · 0 评论 -
Kotlin - 类及成员的可见性
类及成员可见性Kotlin 中可见性有 4 个级别:private -> protect -> internal -> public,从左至右可见范围逐渐放宽。KotlinJava可见性privateprivate自己可见protectedprotected子类可见-default(默认)包内可见(Java 特有)internal-模块内可见(Kotlin 特有)public(默认)public外部可见为了方便理解原创 2021-01-30 22:18:57 · 732 阅读 · 0 评论 -
Kotlin - 面向对象之继承与实现
继承是面向对象编程的三大特性之一,在开发过程中会经常使用,继承可以让子类拥有父类的功能,也可以对父类功能进行增强修改。面向对象编程的三大特性:封装、继承、多态继承普通类Kotlin 中默认 类、方法 都是 final 的,因此默认无法被子类继承或重写,但可通过 open 关键字来解除:父类需要 open 才可以被继承父类方法、属性需要 open 才可以被覆写覆写父类成员需要 override 关键字open class Person() { open fun walk() {原创 2021-01-30 22:17:18 · 828 阅读 · 0 评论 -
Kotlin - 面向对象之抽象类与接口
接口接口是一种约定或协议,需要使用 interface 定义:interface InputDevice { fun input(event: Any)}接口不能有状态,我们可以在接口中声明一个类似"属性"的变量 x,但它并不是一个属性,相当于只是声明 getX/setX 方法:interface InputDevice { //val version: String = "default" // IDE报错:Property initializers are not allow原创 2021-01-30 22:15:26 · 538 阅读 · 0 评论 -
Kotlin - 参数与异常
具名参数具名参数就是在调用函数时,给函数的实参附上形参:fun sum(arg1: Int, arg2: Int) = arg1 + arg2fun main(vararg args: String) { sum(arg1 = 2, arg2 = 3) sum(arg2 = 3, arg1 = 2)}使用具名参数可以把实参精确的传递给指定形参,因此具名参数可以不用按顺序传入。变长参数vararg 可以让某个参数接收多个值,vararg 修饰的参数称为变长参数:fun he原创 2021-01-30 22:13:45 · 361 阅读 · 0 评论 -
Kotlin - 分支与循环
分支语句Kotlin 中的分支语句有两种,分别是 if...else 和 when。if 表达式Kotlin 可以像 Java 那样,使用 if...else 语句,通过判断条件来修改变量的值:var name = ""if (local == "en") { name = "lqr"} else { name = "吴彦祖"}但这种写法还不够简洁,Kotlin 对 if...else 进行发加强,支持 if表达式 ,可以对上述代码进行简化:val name = if (原创 2021-01-30 22:12:00 · 528 阅读 · 0 评论 -
Kotlin - 运算符与中缀表达式
基本运算符常见的基本运算符有 +-*/%^? ,在 Kotlin 中,这些运算符都会有对应的具名函数:表达式翻译为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)除此之处,还有一些常用的操作符(统称运算符),例如 in、[]、() 等:表达式翻译为a in bb原创 2021-01-30 22:10:26 · 363 阅读 · 0 评论 -
Kotlin - 类成员
类成员类成员包括 成员方法 和 成员属性:class Artist(var name: String) { // 成员属性 name var age = 18 // 成员属性 age fun dance(danceName: String) { // 成员方法 dance println("$name 正在跳 $danceName") } fun sing(singName: String) { // 成员方法 sing printl原创 2021-01-30 22:08:31 · 242 阅读 · 0 评论 -
Kotlin - 函数与Lambda表达式
函数函数是以特定功能组织起来的代码块,函数定义格式如下:fun 函数名:[返回值类型]{[函数体]}fun 函数名 = [表达式]fun sum(arg1: Int, arg2: Int): Int { return arg1 + arg2}如果函数方法体只有一行代码,那可以将 {} 改为 =,去掉 return,表达式的值将作为函数返回值:fun sum(arg1: Int, arg2: Int) = arg1 + arg2默认返回值类型任何函数都是有返回值的,一般函数方原创 2021-01-30 22:06:38 · 215 阅读 · 0 评论 -
Kotlin - 常量与变量
常量Kotlin 中的常量使用 val 修改,一旦定义值后"不可再修改",常量类型分 2 种:运行时常量(val):编译期不能确定它的值,代码中会保留变量对它的引用。编译期常量(const val):编译期就知道值,并且会把代码中所有对它的引用都替换成它的值。下面我们来举例看看,这两者在代码层面上的区别到底是什么。运行时常量(val)这是一段很简单的 Kotlin 代码,先定义一个常量 FINAL_NAME,再定义一个变量 myName 引用常量 FINAL_NAME:val FINAL_原创 2021-01-30 22:05:05 · 866 阅读 · 1 评论 -
Kotlin - 区间与数组
区间(Range)区间是一个数学上的概念,表示范围。区间的声明Kotlin 中可以使用 .. 或 until 来声明区间:val range: IntRange = 0..1024 // 闭区间[0,1024],包括1024val rangeExclusive: IntRange = 0 until 1024 // 半开区间[0,1024),不包括1024val emptyRange: IntRange = 0..-1 // 空区间[]其实这里的 .. 操作符对应的是 Int 类中的一个 r原创 2021-01-28 23:02:21 · 746 阅读 · 0 评论 -
Kotlin - 空类型和智能类型转换
空类型Kotlin 跟 Java 的最大不同应当就属空类型这点了,使用 Kotlin 开发,IDE 会智能的对可能为空的地方进行报错提示,开发者必须处理该错误,否则连编译都通过不了,从而降低程序 NullPointException 异常的出现几率,所以,一般情况下使用 Kotlin 开发很少见到 NPE 异常。非空与可空类型fun getName(): String { return "lqr"}这是一个很普通的函数声明,它指明了函数返回值是一个 String 类型,对此,Kotlin原创 2021-01-28 22:59:19 · 292 阅读 · 0 评论 -
Kotlin - 类与构造器
类是什么?类是一个抽象的概念,是具有某些特征的事物的概括,不特定指代任何一个具体的事物。写法:class <类名> { <成员>}Number(Int、Float、Byte)、字符串(String)也是类class Girl constructor(var nature: String,var appearance: String,var sound: String){ // 构造方法的方法体 init { println("女原创 2021-01-21 21:08:01 · 453 阅读 · 0 评论 -
Kotlin - 数据类型
Boolean 类型示例代码:val aBoolean: Boolean = trueval anotherBoolean: Boolean = falsekotlin 中的 Boolean 在多数情况下,相当于 Java 中基本类型 boolean,只有在必要情况下才会装箱成 Java 中的装箱类型 Boolean,由编译器决定,通常我们不需要关心。Number 类型Number 即数字,主要包括整型和浮点型:分类类型位宽浮点型Double64Float32原创 2021-01-20 20:30:02 · 434 阅读 · 0 评论