Kotlin初階(2)bash
第一篇入口:Kotlin初階(2)ide
//使用下劃線使數字常量更易讀
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
複製代碼
fun forCircle() {
for (i in 1..5 step 1) {
print(i)
//輸出12345
}
for (i in 5 downTo 1 step 1) {
print(i)
//輸出54321
}
for (i in 1..5 step 2) {
print(i)
//輸出13
}
for (i in 1 until 5 step 1) {
print(i)
//輸出1234,沒有5 等同於[1,5)
}
}
複製代碼
typealias f = Foo//類型替代(f表明新的名詞,Foo表明須要另起名字的對象名,好比,Foo全名爲:尼古拉斯.凱奇.趙四,那麼f能夠叫作趙四,哪裏須要這麼高大上的名稱)
複製代碼
fun getStringLength(obj: Any): Int? {
if (obj !is String) {
return null
}
//此時obj已經自動轉化爲string類型
return obj.length
}
複製代碼
1三、lambda表達式使用之一函數
//limbda表達式
val sumLambda: (Int, Int) -> Int = { x, y -> x + y }//xy是入參,x+y是返回值
複製代碼
//可變長度入參
fun sum5(vararg v: Int): Int {
var sum = 0
for (vt in v) {
sum += vt
}
return sum
}
複製代碼
class Runoob constructor(name1: String = "jack", psd1: String = "123456") {//默認參數
//主構造器中不能包含任何代碼,初始化代碼能夠放在初始化代碼段中,初始化代碼段使用 init 關鍵字做爲前綴
init {
println("name : $name1, psd : $psd1")
// name = ""//這裏連name常量都沒有定義,因此不可以進行賦值
}
constructor(name: String, psd: String, addr: String) : this(name, psd) {
this.name = name
this.psd = psd
}
//次構造函數
constructor(name: String, psd: String, age: Int) : this(name, psd) {
}
var nickName = name1
get() {
return nickName
}
var name: String
get() {
return name.toUpperCase()
}
set(value) {
name = value
}
var psd: String = ""
private set
get() {
return psd + "@"
}
}
複製代碼
interface BaseView {
var mNickName: String//抽象的屬性
fun walk() {//方法體是否實現是可選的
println("BaseView,walk!!!")
}
fun yeal() {}//
}
複製代碼
//密封類
sealed class Expr//至關於枚舉的擴展
data class Const(val number: Double) : Expr()//這裏只有另一個double的狀態入參
data class Sum(val e1: Expr, val e2: Expr) : Expr()//這個密封類裏面就有兩個Expr的狀態入參
object NotANumber : Expr()
fun eval(expr: Expr): Double = when (expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
//由於已經覆蓋了因此的狀況,就不須要else子句了
}
複製代碼
Color.BLACK.name
enumValues<Color>().size
enumValues<Color>().get(0)
enumValues<Color>().plus(Color.WHITE)
enumValues<Color>().iterator()
enumValueOf<Color>(Color.WHITE.toString())
複製代碼
fun <T : Comparable<T>> sort(list: List<T>) {
}
sort(listOf(1, 2, 3)) // OK。Int 是 Comparable<Int> 的子類型
// 錯誤:HashMap<Int, String> 不是 Comparable<HashMap<Int, String>> 的子類型
// sort(listOf(HashMap<Int, String>()))
複製代碼
val site = object {
var name = "jack"
var url = "www.tansu.com"
}
複製代碼
interface MyBase {
fun bark()
// fun bak()
}
class BaseImpl(val x: Int) : MyBase {
fun bak() {}
override fun bark() {
println("x:$x")
}
}
// 經過關鍵字 by 創建 委託類
class Deried(b: MyBase) : MyBase by b
fun test3() {
var baseImpl = BaseImpl(10)
Deried(baseImpl).bark()
baseImpl.bak()
// Deried(baseImpl).bak()//沒法訪問到非interface定義的方法
}
// 定義包含屬性委託的類
class Example {
var p: String by Delegate()
//說明:若是p是var的話,那麼委託類須要有getValue和setValue兩個方法(由於此時是可變的變量,須要由set方法)
//說明:若是p是val的話,那麼委託類只須要有getValue方法便可,另一個能夠不要求(此時爲不可變常量,不須要set值進去)
}
// 委託的類
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, 這裏委託了 ${property.name} 屬性"//這裏name爲p
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef 的 ${property.name} 屬性賦值爲 $value")//value爲設置進來的值
}
}
fun test4() {
val e = Example()
println(e.p) // 訪問該屬性,調用 getValue() 函數
e.p = "Runoob" // 調用 setValue() 函數
println(e.p)
// Example@433c675d, 這裏委託了 p 屬性
// Example@433c675d 的 p 屬性賦值爲 Runoob
// Example@433c675d, 這裏委託了 p 屬性
}
複製代碼
class User {
var name: String by Delegates.observable("初始值") { prop, old, new ->
println("舊值:$old -> 新值:$new. prop:$prop")
}
}
val user = User()
user.name = "第一次賦值"
user.name = "第二次賦值"
// 舊值:初始值 -> 新值:第一次賦值
// 舊值:第一次賦值 -> 新值:第二次賦值
複製代碼
//把屬性儲存在映射中
class MyWebSite(val map: Map<String, Any?>) {
val name: String by map
val url: String by map
}
使用
var myWebSite = MyWebSite(mapOf("name" to "jack", "url" to "www.baidu.com"))
myWebSite.name
myWebSite.url
//結果讀取出來
複製代碼
class Foo {
var notNullBar: String by Delegates.notNull<String>()
}
使用
var foo = Foo()
foo.notNullBar = "bar"
println(foo.notNullBar)
複製代碼
第一篇入口:Kotlin初階(2)post