Kotlin-基礎第三弾

4520 ワード

KotlinはJVMベースの新しいプログラミング言語です.JetBrainsによって開発されました.Googleが推奨していますので、その重要性が分かります.深く入ると、kotlinの優雅さが分かります.コードを書く時に手間が省けます.
Kotlinについての学習はネット上にたくさんあります.今はいくつかの公式サイトを共有しています.http://kotlinlang.org/docs/reference/他人のまとめhttps://github.com/youxin11544/Kotlin-learning
ここでは公式サイトのようにいちいち説明しません.自分も公式サイトから勉強して他の人のブログを見に行きます.知識には深くないかもしれませんが、初心者にとっても価値があります.
スタート
kotlin依頼メカニズム
委託モードも代理モードであり、ソフトウェア設計モードの一つの基本技術であり、委託モードでは、二つのオブジェクトが同一の要求を処理するために参加し、要求を受けたオブジェクトは要求を別のオブジェクトに委託して処理する.
javaとAndroidは、委託機構を用いてAOPにおいて、JavaではInvocationHandlerインターフェースを継承する方法を用いて代理を実現し、AndroidではAsppectJを使用して実現される.ここでKotlinの依頼パターンを説明します.
  • 類の委託、すなわち上述の委託モードの定義であるが、Kotlinにおいては、より便利で、より柔軟に実現される.
    これは継承の代わりとして、byキーワードを直接使用してコレクションの方法をリストオブジェクトに委託します.
  • 属性はKotlinの中のDelegates類に委託されており、lazy、notNull()、observable(「」)、vetoable(「」)、Map形式
  • の3つの依頼を内蔵している.
  • lazyは、怠惰な負荷を行うために使用され、最初に使用されたときに初期化動作
     class MyList(list: ArrayList) : Collection by list {
    
     }
    
  • を実行する.
  • notNull()は、初期化できない段階で属性値が決定された場合に使用される
         //            (     )
         val list: ArrayList by lazy {
             ArrayList()
         }
    
  • observable観察者とjavaの観察者パターンは同じです.
  • vetoable()条件付きの委託機構は、戻ってきたtrueとfalseを通じて、oldValueが前かそれとも最初かを判断する
         //   str,              
         var str: String by Delegates.notNull()
    
  • である.
  • Mapは、新しい割当方法によってクラス属性を付与する
         //oldValue         newValue    
         var str: String by Delegates.observable(""){//   
             property, oldValue, newValue ->
             println("${property.name}  old=$oldValue  new=$newValue")
         }   
    
  • .
    これ以外にもカスタム委託ができます.具体的な定義はnotNull()の委託に倣うことができます.
         //  true observable      
         var str1: String by Delegates.vetoable(""){
             property, oldValue, newValue ->
             println("${property.name}  old=$oldValue  new=$newValue")
             true   
         }
         //  false   oldValue      
         var str2: String by Delegates.vetoable(""){
             property, oldValue, newValue ->
             println("${property.name}  old=$oldValue  new=$newValue")
             false
         }
    
    読み取り可能な依頼メカニズムを設定して、ReadOnlyPropertyクラスを継承すればいいです.
    コツリン・ラバンダ表現
    まず、小さな例をあげます.
         class User(val map: Map){
             val name: String by map
             val age: Int by map
         }
         
         val user = User(mapOf("a" to 1))
    
    矢印の前にパラメータがあります.矢印の後に関数があります.コールから言えばJavaより簡単で優雅なものが多いですが、実際の用途は?私たちは一つの関数のためにlambanを送ることができます.
    private class NotNullVar() : ReadWriteProperty {
        private var value: T? = null
    
        public override fun getValue(thisRef: Any?, property: KProperty): T {
            return value ?: throw IllegalStateException("Property ${property.name} should be initialized before get.")
        }
    
        public override fun setValue(thisRef: Any?, property: KProperty, value: T) {
            this.value = value
        }
    }
    
    伝達関数である以上はもちろん、関数を伝達して入ることもできます.よく使われています.ここには関数の参照が延びています.また、属性の引用もあります.ここでは
    val action = {i: Int, j: Int -> println("i=$i   j=$j")};
    
    action(1,2)
    
    最後のパラメータがラダの場合、大かっこは外に置くことができます.
    fun lambdaTest(arg1: Int, arg2: Int, oper: (a: Int, b: Int) -> Int): Int {
        var result: Int = Int.MIN_VALUE
        if (arg2 != 0) {
            result = oper(arg1, arg2)
        }
        return result
    }
    
    fun main(args: Array) {
        lambdaTest(1, 2, { a: Int, b: Int -> a / b })
    
    lambada表現を使う場合も多いです.例えば、集合の中を巡回するなどの操作があります.
    listOf(1, 2, 3).forEach(::println)
    
    var name = "1"
    val p = ::name
    p.set/get
    
    Cotlin演算子の再負荷式
    lambdaTest(1, 2){ a: Int, b: Int -> a / b }
    
    これで、Rmb(1)+Rmb(2)を使って計算することができます.簡単ですか?このような操作は前に述べた中綴り表現と同じです.真ん中は演算子です.
    kotlin注釈と反射
    Kotlinの注釈はjavaと似ています.先に注釈の種類を決めて、ライフサイクルを確定します.
    val list = arrayListOf(1, 2, 3)
    list.forEach { value -> }
    
    使用すると、直接にクラス前funの前にあります.
    class Rmb(var num: Int) {
        operator fun plus(rmb: Any?) {
    
        }
    }
    
    Kotlinは反射すると通ります.
    @Target(AnnotationTarget.FIELD,
            AnnotationTarget.CLASS,
            AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.SOURCE)
    annotation class Path
    
    この2つの方法はクラスのオブジェクトを得るために、さらに対応する属性と方法を反射することができます.
    これで基礎の第3部分は終わって、堅持し続けて、どのみちいくつかの仕返しのがあります.