参考:
- Kotlin Primer·第二章·基本语法
- 用 Kotlin 开发 Android 项目是一种什么样的感受?
- 快速上手 Kotlin 的 11 招
//当data不为空的时候,执行语句块
data?.let{
//...
}
//相反的,以下代码当data为空时才会执行
data?:let{
//...
}
say()
的函数,接受一个String类型的参数,并返回一个String类型的值 fun say(str: String): String {
return str
}
fun say(str: String): String = str
fun getIntValue(value: Int) = value
//在Java中,我们这么表示一个变长函数
public boolean hasEmpty(String... strArray){
for (String str : strArray){
if ("".equals(str) || str == null)
return true;
}
return false;
}
//在Kotlin中,使用关键字vararg来表示
fun hasEmpty(vararg strArray: String?): Boolean{
for (str in strArray){
if ("".equals(str) || str == null)
return true
}
return false
}
class StringUtils {
companion object {
fun isEmpty(str: String): Boolean {
return "" == str
}
}
}
compnion object
表示外部类的一个伴生对象,可以理解为外部类自动创建一个对象作为自己的field。Kotlin默认会将所有的包级别函数放在一个自动生成的叫EcampleKt的类中
在Kotlin中没有
static
关键字,那么如果子啊Java代码中想要通过类名调用一个 Kotlin 类的方法,你需要给这个方法加入@JvmStatic注解
class Person(private var name: String) {
init {
name = "Zhang Tao"
}
internal fun sayHello() {
println("hello $name")
}
}
class Person(private var name: String) {
private var description: String? = null
init {
name = "Zhang Tao"
}
constructor(name: String, description: String) : this(name) {
this.description = description
}
internal fun sayHello() {
println("hello $name")
}
}
data数据类:data修饰的类称之为数据类
class Single private constructor() {
companion object {
fun get():Single{
return Holder.instance
}
}
private object Holder {
val instance = Single()
}
}
interface Animal{
fun bark()
}
class Dog :Animal {
override fun bark() {
println("Wang Wang")
}
}
class Cat(animal: Animal) : Animal by animal {
}
fun main(args: Array) {
Cat(Dog()).bark()
}
Unit
空函数:不需要实现其方法。相当于表示一个值的类型。类似于Java中的void类型editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) = Unit
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit
})
public class Nothing private constructor()
fun main(args: Array<String>) {
for (i in 1..100 step 20) {
print("$i ")
}
}
上面的代码实际..的原理实际上就是对一个 Int 值,调用他的 rangeTo方法,传入一个 Int 参数,并返回一个区间对象。
for (i in 1.rangeTo(100) step 20) { print("$i ") }
{ x: Int, y: Int ->
println("${x + y}")
}(1, 3)
Kotlin中真正把Lambda抽象为一个类型
val printMsg = { msg: String ->
println(msg)
}
fun main(args: Array<String>) {
printMsg.invoke("hello")
}
//fun main(args: Array) {
// printMsg("hello")
//}
首先声明了一个名为
printMsg
的Lambda,它接收了一个String类型的值作为参数,然后main函数中调用它,如果还想省略,你还可以在调用时直接省略invoke,像函数一样使用。
Lambda 表达式最大的特点是可以作为参数传递。当定义一个闭包作为参数的函数,称这个函数为高阶函数。
fun main(args: Array<String>) {
log("world", printMsg)
}
val printMsg = { str: String ->
println(str)
}
val log = { str: String, printLog: (String) -> Unit ->
printLog(str)
}
//其实就是 log 有两个参数,一个str:String,一个printLog: (String) -> Unit。