KotlinはJavaよりも優れています。

Kotlinの利点

Kotlinの方が安全です。
これが最も重要な利点です。null参照は型システムによって制御されるため、NullPointerExceptionが再び発生することはありません。このnullポインタ例外は、いつでも爆発する可能性のある隠れた時限爆弾のようなものです。

KotlinでJavaコードを呼び出すには、Javaコードに空でないアノテーションが必要です。

コードは簡潔です
。Lambda式を使用して、最後のクラスコードの多く、特に冗長なfindViewByIdを保存します。少ないコードでエラーを減らすことができると言われています。

関数サポート
高次関数の使用は、戻り値またはパラメーター値として使用でき、特に便利です。
高次関数とは何ですか?関数をパラメーターとして使用し、戻り値が高階関数である関数を使用します。各関数はラムダ式に対応します。
一般的な高次関数map()、forEach()、flatMap()、reduce()、fold()、filter()、takeWhile()、let()、apply()

拡張関数
KotlinはC#に似ています。C#は、クラスを継承したり、デコレーターなどの設計パターンを使用したりせずに、クラスの新しい関数を拡張できます。Kotlinは拡張機能と拡張属性をサポートしています。
1)式を関数の戻り値として直接使用できます
2)拡張関数:funクラス名。拡張メソッド名(パラメーターリスト){メソッド本体}またはfunクラス名。拡張メソッド名(パラメーターリスト)=式

fun MyClass.add(a:Int,b:Int) = a+b

3)拡張属性:varクラス名。拡張属性/他のメソッドに対応

var MyClass.d: String
    get() = "sdasda"
    set(value){
    
    d = value}//MyClass的扩展成员变量d

Kotlinには静的メンバーはありません。
対応するソリューションはコンパニオンクラスです

javaで相互に呼び出す
ことができる Kotlinの標準ライブラリは、Javaライブラリの拡張ですが、AndroidライブラリをKotlinで使用できます。KotlinとJavaコードで相互に呼び出すことができ、完全にバリアフリーです。

Javaとの違い

  1. 基本的なタイプは似ており、開梱と梱包のプロセスはなくなりました
  2. 変数宣言は、var変数変数とval読み取り専用変数のみです。Kotlinは、変数のデータ型を自動的かつインテリジェントに決定できます
  3. Javaはchar> int> long自動変換をサポートしています。不要なエラーを減らすため、Kotlinではサポートされていません。
  4. Javaの元のクラスはObjectですが、Kotlinでは、Anyメソッドにはequals()、hashCode、およびtoStringメソッドしかありません。
  5. Javaでの型変換とは、継承関係の存在を指し、サブクラスは自動的に親クラスに変換されますが、親ロータークラスは強制変換を必要とします。Kotlinの型変換ではasキーワードを使用します
  6. Javaには同じクラス名とパッケージ名が複数あります。クラス名は参照用に必要です。Kotlinでは、次のようにしてください
import A.Student as AS//将A包下的Student类取外号为"AS"
import B.Studnet as BS//将B包下的Student类取外号为"BS"
  1. Kotlinには、Rangeと呼ばれる独自の範囲クラスがあります。たとえば、整数間隔の場合:
var intRange:IntRange = 0..1024//区间为[0,1024],注意是全闭的
var intRange2:IntRange = 0 until 1024//区间为[0,1024),注意是半闭半开的,包头不包尾

println("50是否存在与区间[0,1024]:"+intRange.contains(50))
println("-3是否存在与区间[0,1024):"+intRange.contains(-3))

//遍历区间
for(i in intRange){
    
    
    println(i)
}
  1. Kotlinでは、配列の一般的な宣言は、宣言するintArrayOfおよびarrayOfで始まります。

  2. Kotlinの許可修飾子にはデフォルトがなく、対応するものは内部に変更されます

  3. Kotlinでの使用」「Javaのequals()メソッドに相当。使用」= "Javaと同等にする" == "では、2つの参照が同じオブジェクトであるかどうかを比較します。

  4. KotlinにはSwitchステートメントがありません。それはwhenに置き換えられます。より強力です。その判定値は式にすることができます。

  5. Kotlinのコンストラクターはキーワードコンストラクターを使用する必要があります。または、メインコンストラクターと呼ばれる特別なデフォルトの構築メソッドがあります。

class Student(var name:String,var age:Int)//构造器的特殊写法
  1. Kotlinでは、クラスに従属する関数は「メンバーメソッド」と呼ばれ、クラスに従わない関数は関数と呼ばれます。たとえば、次のパラメータはメソッドブロックの形式で表現されます。これは「関数」です。

  2. Kotlinのデフォルトのアクセス許可はパブリックであり、Javaのデフォルトのアクセス許可ではありません。
    final:Kotlinのデフォルトの修飾子です。クラスを継承したい場合は、openを使用して変更する必要があります。
    データ:この修飾子は非常に便利でユニークです。データで変更した後:
    1)すべてのメンバーは演算子で自動的に宣言され、ゲッターとセッターはメンバーに対して自動的に生成されます。
    2)equals()/ hashCode()およびtoString()メソッドは自動的に書き直されます
    。3)データクラスにはパラメーターのないコンストラクターがないため、ピットのように感じられるため、Kotlinは公式にNoArg(パラメーターのないコンストラクター)を使用するソリューションを提供しました)そして、AllOpen(継承可能)を使用して問題を解決します。

  3. Kotlinインターフェースでは、エラーを報告せずにメソッドを実装できます。Javaでは次のエラーが報告されますが、Kotlinではエラーは報告されません。

interface JieKou{
    
    
    fun A(){
    
    
       //方法体a
       println("接口里面的方法,我是方法体")
    }
}
  1. クラスの内部クラスでは、キーワードinnerを追加する必要があります。追加しない場合、クラスはデフォルトで静的です。非静的内部クラスに対するこのキーワードの競合は、「this @ external class name」を使用して区別できます。
var ab  = A.AB()   //实例化A类中的静态内部类AB
var ac  = A().AC() //实例化A类中的非静态内部类AC

A a=new A();
A.AC ac =a.new AC();

A.AC ac=new A.AC();
  1. Kotlinのクラス名以外の関数であるパッケージレベルの関数は、パッケージレベルの関数です。パッケージレベル関数(拡張関数を含む)のすべての関数は静的です。コンパイル時に、Kotlinはすべてのパッケージレベル関数を1つのクラスに入れ、Javaはそのような名前ですべてのパッケージにアクセスできますTest.getMessage()などのレベル関数
//文件名  Test.kt
class Student(var name:String,var age:Int){
    
    
}

fun getMessage(){
    
    //这个扩展方法被编译Test.kt中的静态方法public static getMessage(Student student)
    println("")
}

  1. Kotlinのワイルドカードは「?」ではなく「*」です。「?」は空でないと判断するために使用されます
  2. 正規表現は、Javaの従来の方法に加えて、使用する新しい方法があります。
var results = Regex(geShi).split(str)//Regex为Kotlin中处理正则表达式的工具类
  1. IOストリームで「use」を使用して、読み取りおよび書き込みファイルを自動的に閉じます

AndroidにおけるKotlinの長所と短所

Kotlinのいくつかの利点は、Kotlin AndroidとJavaを使用して比較優位を作成する際の利点と欠点をここに追加するために、以前に述べました

  1. Kotlinは複数のプラットフォームとJetpack Compose UIをサポートしていますが、Javaはサポートしていません。Android開発の場合は、Jetpackが提供するさまざまなサポートにできるだけ早く慣れてください

不利益

  1. Kotlinコンパイラの速度はJavaの速度より少し遅いですが、この点は最適化と改善が進んでおり、継続的な最適化によって速度の差が大きくなりすぎることはないと思います。

コンパニオンクラス

この機能を個別に説明する必要があります。Kotlinには静的メソッドはありません。コンパニオンクラスの変数とメソッドは、静的変数と静的メソッドと同等です。

  companion object {
    
    //静态方法和变量都应该写在这里面
        var  a:Int =  3;//静态变量
        fun get():Int{
    
    
            return a
        }
    }

Kotlinのいくつかの注釈

1. @ JavaFiled:属性をJava変数にコンパイルする

2. @ JvmStatic:オブジェクトのメソッドをJava静的メソッドにコンパイルします。通常、コンパニオンオブジェクトで使用されます。

3. @ JvmOverloads:デフォルトのパラメーター生成オーバーロードメソッド

4. @ file:JvmName:Kotlinファイルのコンパイル済みクラス名を指定します

インライン関数

let
let拡張関数は、実際にはスコープ関数です。特定のスコープで変数を定義する必要がある場合は、let関数が適切な選択です。let関数の別の関数は、いくつかのnull判定を記述しないようにすることです。操作。

//1)判断object为null的操作
object?.let{
    
    //表示object不为null的条件下,才会去执行let函数体
   it.todo() //在函数体内使用it替代object对象去访问其公有的属性和方法
   1000
}

オブジェクトは、ファンクションブロックで参照できます。戻り値は、ファンクションブロックの最後の行であるか、戻り式が指定されています。

その使用シナリオは次のとおりです。
シナリオ1:最も一般的に使用されるシナリオは、let関数を使用してnull許容オブジェクトを均一に処理することです。
シナリオ2:次に、変数を特定のスコープで使用できることを明確にする必要があります。

with
with関数は、拡張形式では存在しないため、以前の関数とは少し異なります。オブジェクトを関数のパラメータとして受け取り、これを介して関数ブロック内でこのオブジェクトを参照できます。戻り値は、ファンクションブロックの最後の行であるか、戻り式が指定されています。
次の2つのコードは同等です。

val result = with(user, {
    
    
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
})

val result = with(user) {
    
    
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
}

使用シナリオ
同じクラスの複数のメソッドを呼び出すのに適しています。クラス名の繰り返しを保存して、クラスのメソッドを直接呼び出すことができます。これは、AndroidのRecyclerViewのonBinderViewHolderでよく使用され、データモデルの属性はUIにマップされます。

override fun onBindViewHolder(holder: ViewHolder, position: Int){
    
    
   val item = getItem(position)?: return
   
   with(item){
    
    
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
	   holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
	   holder.tvExtraInf.text = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
   
   }

}

run
関数は、実際にはletとwithの組み合わせであると言えます。run関数は、ラムダ関数をパラメーターとしてのみ受け入れ、クロージャーの形式で返します。戻り値は、最後の行の値または指定された戻り式です。

override fun onBindViewHolder(holder: ViewHolder, position: Int){
    
    
   
  getItem(position)?.run{
    
    
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
	   holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
	   holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
   }
}

letとfunctionを使用するすべてのシナリオに適用できます。run関数はlet関数とwith関数の組み合わせであるため、正確には、let関数は関数本体のitパラメーターを使用してオブジェクトを置き換える必要があるという事実を補います。run関数では、with関数のように省略して、インスタンスのパブリック属性に直接アクセスできます。一方、メソッドは、with関数がオブジェクトに渡された場合のnull判定の問題を補い、run関数では、let関数のようにnull判定を行うことができます。

apply
apply functionとrun functionのように、唯一の違いは、返される値がそれぞれの構造的に同じではないこと、クロージャーはrun関数です。コードの最終行の値を返し、apply関数は着信オブジェクトを返します。自体。

以下はwith関数とは異なり、結果値の結果はユーザーを参照します

fun main() {
    
    
    val user = User("Kotlin", 1, "1111111")

    val result = user.apply {
    
    
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }
    println("result: $result")
}

使用シナリオ
1)applyは通常、オブジェクトインスタンスが初期化され、オブジェクトのプロパティを割り当てる必要がある場合に使用されます。または、XMLビューを動的に拡張する場合、データをビューにバインドする必要がありますが、このシナリオは非常に一般的です。

mSheetDialogView = View.inflate(activity, R.layout.biz_exam_plan_layout_sheet_inner, null).apply{
    
    
   course_comment_tv_label.paint.isFakeBoldText = true
   course_comment_tv_score.paint.isFakeBoldText = true
   course_comment_tv_cancel.paint.isFakeBoldText = true
   course_comment_tv_confirm.paint.isFakeBoldText = true
   course_comment_seek_bar.max = 10
   course_comment_seek_bar.progress = 0

}

2)let関数のようにnullを判断するためにも使用されます。

総括する

まず、Kotlinを使って7か月以上Androidで開発してきました。私自身の経験によれば、Kotlinを使って開発する傾向があります。もちろん、ユーザーエクスペリエンスはそれぞれ異なります。あなたに適しています。

誰もがKotlinを実際に体験して、2つの長所と短所を比較する前に、Kotlinを学び、使用してほしいと思います。使用方法を学ぶことは、IDEAを介してJavaコードをKotlinに単に変換することではなく、Kotlin言語を使用してJavaを記述するだけであり、これは意味がありません。

テクノロジー開発者として、私たちは変化と革新を勇敢に受け入れるべきであり、私たちは問題を見るために元の先入観を使用すべきではありません。練習はすべての真実をテストするための唯一の基準です。練習して初めて自分自身を得ることができます。

積極的にコメントしたりメッセージを残したりすることに異議があるといいので返信しなければならない。是非は反対の議論で決定されます、メッセージを残すことを歓迎します!

おすすめ

転載: blog.csdn.net/luo_boke/article/details/107172965