写给Java程序员的Kotlin简介(一)

作者: 千里山南 | 来源:发表于2016-07-03 00:40 被阅读1194次

Fun

// 形参在前类型在后,分号可以忽略
fun sum(a:Int,b:Int):Int {
    return a+b
}

// 方法只有一个表达式,隐士返回类型
fun sum(a:Int, b:Int)=a+b
fun p(a:Int)=print(a)

fun sum(a:Int, b:Int)[:Unit] {
    return a + b
}

// 最后一个表达式可作为返回值
fun t() {
    2 + 3
}
// 支持默认参数
fun foo(a: Int = 0, b: String = "") { ... }

Declear

val a : Int = 1
如果kotlin可推断出类型,则类型可不写
val b = 3

String Templates

fun (str:String,strs:Array<String>) {
    print("str=$str, first = ${strs[0]}")
}

Null Check

Type? 表示可以为空的类型,可以理解为可为空类型
可以把null赋值给此类类型的变量

var a:Activity? = null // right    
var a2:Activity = null // wrong

在一个block钟如果对某变量做完非空判断后自动由Type?类型转换为Type类型

var s : String? = null;
// s.get(1).toString() wrong here
if (s == null) return ""
return s.get(1).toString()

if not null test
var a:String? = null
a?.length // type is Int?
a?.length ?: 0 // a 为空返回a的长度否则返回0
Type? 如果为null时其toStirng 返回"null"

增强版instanceof

var a : Any? = null
if (a is String)
    a.length

When

fun cases(obj: Any) {
 when (obj) {
    1           -> print("One")
    "Hello"     -> print("Greeting")
    is Long     -> print("Long")
    !is String  -> print("Not a string") 
    else        -> print("Unknown")
    } 
}

Lambda

names.filter { it.startsWith("A") } 
        .sortedBy { it }
        .map { it.toUpperCase() } 
        .forEach { print(it) }

Data Class

data class Customer(val name:String, val email:String)
自动有get set 属性
系统覆写 equals hasCode toString coy方法
可以通过componenet1() ... 访问属性

Read-only Collections

类似 Python 提供不可更改的容器
val list = listOf("a", "b")
val map = mapOf("a" to 1, "b" to 2)
access map accross map["a"]=1

Extension Fun

internal fun <T> Activity.bind(id:Int):T? {
    val v = this.findViewById(id)
    return v as? T
}
// eg:
var mSearchLinear: LinearLayout? = null;
mSearchLinear = bind(R.id.am_search_linear)

internal fun <T> View.bind(id:Int):T? {
val v = this.findViewById(id)
return v as? T
}

internal fun Context.toast(message: String, length: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, message,
            if (length == Toast.LENGTH_SHORT) length else Toast.LENGTH_LONG).show()
}

With

类似vb和js kotlin支持with对同一个对象多步骤操作

Stream

val stream = Files.newInputStream(Paths.get("/some/file.txt")) 
stream.buffered().reader().use { reader ->
    println(reader.readText()) 
}

相关文章

网友评论

    本文标题:写给Java程序员的Kotlin简介(一)

    本文链接:https://www.haomeiwen.com/subject/rqoqjttx.html