img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

* 实现方法
*/
class ScreamBehavior(val n:String): SoundBehavior {
override fun makeSound() = println(“${n.uppercase()} !!!”)
}

class RockAndRollBehavior(val n:String): SoundBehavior {
override fun makeSound() = println(“I’m The King of Rock ‘N’ Roll: $n”)
}

// 将方法调用委托给负责的实现。委托对象是在关键字by之后定义的
// Tom Araya is the “singer” of Slayer
class TomAraya(n:String): SoundBehavior by ScreamBehavior(n)

// You should know 😉
class ElvisPresley(n:String): SoundBehavior by RockAndRollBehavior(n)

fun main() {
val tomAraya = TomAraya(“Thrash Metal”)
tomAraya.makeSound()
val elvisPresley = ElvisPresley(“Dancin’ to the Jailhouse Rock.”)
elvisPresley.makeSound()
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/3d37d21d46314967bccb9501f3fdfc81.png)


### Delegated Properties 属性委派


Kotlin提供了一种委托属性机制,允许将属性集的调用和get方法委托给某个对象。在这种情况下,委托对象应该具有getValue方法。对于可变属性,您还需要setValue。



package com.tianju.kt.scopeFunc

import kotlin.reflect.KProperty

class Example{
var p:String by Delegate()

override fun toString(): String {
    return "Example Class"
}

}

class Delegate() {
operator fun getValue(thisRef: Any?, prop: KProperty<*>): String {
return “ t h i s R e f , t h a n k y o u f o r d e l e g a t i n g ′ thisRef, thank you for delegating ' thisRef,thankyoufordelegating{prop.name}’ to me!”
}

operator fun setValue(thisRef: Any?, prop: KProperty<\*>, value: String) {
    println("$value has been assigned to ${prop.name} in $thisRef")
}

}

fun main() {
val e = Example()
println(e.p)
e.p = “WATT”
}s


![在这里插入图片描述](https://img-blog.csdnimg.cn/d63e097447b74c4aa86c231d85fc7d90.png)


#### lazy懒加载


Kotlin标准库包含一堆有用的委托,比如懒惰的lazy、可观察observable的和其他的



package com.tianju.kt.scopeFunc

class LazySample {
/**
* 静态代码块
*/
init {
println(“created!”)
}

/\*\*

* by lazy 懒加载
*/
val lazyStr: String by lazy {
println(“computed!”)
“my lazy”
}
}

fun main() {
// 创建对象时未初始化属性lazy
val sample = LazySample()
// 调用的时候才会初始化属性
println(“lazyStr = ${sample.lazyStr}”)
println(" = ${sample.lazyStr}")
}


#### map中存储属性


属性委派可用于在映射中存储属性。这对于解析JSON或执行其他“动态”操作等任务非常方便。



package com.tianju.kt.ktLast

/**
* 可以从map转换为对象
*/
class User(val map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}

fun main() {

val stringMap = mapOf(
    "name" to "John Doe",
    "age" to 25
)
println(stringMap)
val user = User(stringMap)
println("name = ${user.name}, age = ${user.age}")

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/ae3e60d35b074b1ea7831753a305adb0.png)


## productivity boosters生产力助推器


### Named Arguments命名参数


与大多数其他编程语言(Java、C++等)一样,Kotlin支持根据方法和构造函数的定义顺序将参数传递给它们。Kotlin还支持命名参数,以允许更清晰的调用,并避免参数顺序错误。



package com.tianju.kt.ktLast

fun format(userName: String, domain: String) = “ u s e r N a m e @ userName@ userName@domain”

fun main() {
println(format(“mario”, “example.com”))
println(format(“domain.com”, “username”))
println(format(userName = “foo”, domain = “bar.com”))
println(format(domain = “frog.com”, userName = “pepe”))
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/cd14e12df85a47209589aaed375bbbbd.png)


### $占位符在String中


字符串模板允许您将变量引用和表达式包含到字符串中。当请求字符串的值时(例如,通过println),所有引用和表达式都会被实际值替换。



package com.tianju.kt.ktLast

fun main() {
val greeting = “Kotliner”

println("Hello $greeting")
println("Hello ${greeting.uppercase()}")

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/11b2449dc78d48d9879ee41ce20b4c75.png)


### Destructuring Declarations 破坏声明语法


破坏声明语法非常方便,尤其是当您只需要一个实例来访问其成员时。它允许您在没有特定名称的情况下定义实例,从而节省了几行代码。



package com.tianju.kt.ktLast

fun findMinMax(list: List): Pair<Int, Int> {
// do the math
return Pair(50, 100)
}

fun main() {
val (x, y, z) = arrayOf(5, 10, 15)
println(x)

// 初始化一个map集合
val map = mapOf("Alice" to 21, "Bob" to 25)
for ((name, age) in map) {
    println("$name is $age years old")
}

val (min, max) = findMinMax(listOf(100, 90, 50, 98, 76, 83))

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/1531239d5f954b1481ee07c8c2b1a963.png)


使用下划线,避免编译器提示指示未使用的变量



package com.tianju.kt.ktL

data class User(val username: String, val email: String)

fun getUser() = User(“Mary”, “mary@somewhere.com”)

fun main() {
val user = getUser()
// 解构实例。声明的值映射到实例字段
val (username, email) = user
println(username == user.component1())

val (_, emailAddress) = getUser()
println(emailAddress)

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/674557fa54f642e49c143a16f45190f5.png)



![img](https://img-blog.csdnimg.cn/img_convert/ff80d6b55432378b4b7dc252fc42154a.png)
![img](https://img-blog.csdnimg.cn/img_convert/205cbcdd55d373ac7c0511cdaf7e2467.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

24389)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐