どうしてKotlinに完全に切り替えるべきですか?

17862 ワード

現代のプログラミング言語を使う時だ!
Kotlinという新しいプログラミング言語を教えてあげたいのですが、次のプロジェクトのために考えるべき理由を教えてあげたいと思います.私は昔Javaが大好きでした.しかし昨年、私はいつでもできるだけKotlinでプログラミングしていることに気づきました.この点に基づいて、Javaがより良い選択になる状況は本当に考えられません.
KotlinはJetBrainsによって開発された.実際、IntelliJやReSharperなどのIDEキットの背後にある人々がKotlinをキラキラさせたのです.それはとても優雅で、とても簡潔です.プログラミングを快適で効率的な体験にします.
KotlinはJavaScriptとマシンコードにコンパイルできますが、主な環境であるJVMに注目します.
そのため、コマンドではなくKotlinに完全に切り替える理由がたくさんあります.
0#Java相互運用性
KotlinはJavaと100%相互運用可能です.Javaの残りのプロジェクトでKotlinを使用し続けることができます.あなたの好きなJavaフレームワークはすべて使用できます.Kotlinでどんなフレームワークを作成しても、Javaの忠実な友达は喜んで受け入れます.
1#よく知っている文法
Kotlinは学術のために生まれた奇妙な言語ではない.その文法はOOP(オブジェクト向けプログラミング)分野からのプログラマーにとってよく知られています.入門者にとって、多かれ少なかれ理解しやすい.もちろん、Javaとは違うものもあります.たとえば、再設計されたコンストラクション関数とvalvar変数宣言.以下に示すコードの大部分はベースです.
class Foo {

    val b: String = "b"     // val means unmodifiable
    var i: Int = 0          // var means modifiable

    fun hello() {
        val str = "Hello"
        print("$str World")
    }

    fun sum(x: Int, y: Int): Int {
        return x + y
    }

    fun maxOf(a: Float, b: Float) = if (a > b) a else b

}

2#文字列挿入
Java版のString.format()のようです.しかし、よりスマートで、より読み取り可能です.言語に組み込まれています
val x = 4
val y = 7
print("sum of $x and $y is ${x + y}")  // sum of 4 and 7 is 11

3#タイプ推定
Kotlinはタイプを推定し、どこにいてもコードの可読性が向上すると感じます.
val a = "abc"                         // type inferred to String
val b = 4                             // type inferred to Int

val c: Double = 0.7                   // type declared explicitly
val d: List = ArrayList()     // type declared explicitly

4#インテリジェントタイプ変換
Kotlinコンパイラはコードロジックを追跡します.可能であれば、タイプが自動的に変換されます.これは、instanceofチェックの後に明示的なタイプ変換が必要ないことを意味します.
if (obj is String) {
    print(obj.toUpperCase())     // obj is now known to be a String
}

5#直感的な等価性判断
明示的にequals()を呼び出すことはできません.現在==オペレータは構造の等価性をチェックします.
val john1 = Person("John")
val john2 = Person("John")
john1 == john2    // true  (structural equality)
john1 === john2   // false (referential equality)

6#デフォルトパラメータ
複数のパラメータの異なる類似の方法を定義する必要はありません(関数の再ロードは必要ありません):
fun build(title: String, width: Int = 800, height: Int = 600) {
    Frame(title, width, height)
}

7#名前付きパラメータ
デフォルトのパラメータとともに(使用)、ネーミングパラメータはコンストラクタに対する需要を消滅させます.
build("PacMan", 400, 300)                           // equivalent
build(title = "PacMan", width = 400, height = 300)  // equivalent
build(width = 400, height = 300, title = "PacMan")  // equivalent

8#When式switch...case...は、より読み取りやすく、より柔軟なwhen式に置き換えられます.
when (x) {
    1 -> print("x is 1")
    2 -> print("x is 2")
    3, 4 -> print("x is 3 or 4")
    in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")
    else -> print("x is out of range")
}

式として使用したり、文として使用したりできます.パラメータを持つことも、パラメータを持たないこともできます.
val res: Boolean = when {
    obj == null -> false
    obj is String -> true
    else -> throw IllegalStateException()
}

9#属性
カスタムsetおよびget動作を公開フィールドに追加できます.これは、意味のないgettersetterがコードを膨張させないことを意味します.
class Frame {
    var width: Int = 800
    var height: Int = 600

    val pixels: Int
        get() = width * height
}

10#データクラス
データクラスは、`toString(),equals(),hashCode(),およびcopy()を含むPOJOである.Javaとは異なり、100行を超えるコードはありません.
data class Person(val name: String,
                  var email: String,
                  var age: Int)

val john = Person("John", "[email protected]", 112)

11#オペレータリロード
あらかじめ定義されたオペレータのセットをリロードして、読みやすさを向上させることができます.
data class Vec(val x: Float, val y: Float) {
    operator fun plus(v: Vec) = Vec(x + v.x, y + v.y)
}

val v = Vec(2f, 3f) + Vec(4f, 1f)

12#構造関数宣言
一部のオブジェクトは破棄できます.たとえば、反復マッピング(map)に非常に役立ちます.
for ((key, value) in map) {
    print("Key: $key")
    print("Value: $value")
}

13#範囲
可読性のため:
for (i in 1..100) { ... } 
for (i in 0 until 100) { ... }
for (i in 2..10 step 2) { ... } 
for (i in 10 downTo 1) { ... } 
if (x in 1..10) { ... }

14#拡張関数
Javaを使用して1つのListオブジェクトをソートしたのを初めて覚えていますか?sort関数が見つかりません.だから、指導者に聞いたり、Googleに勉強したりしなければなりません.その後、Collections.sort()オブジェクトを大文字に変換する必要がある場合は、自分のアシスタント関数を作成します.Stringという関数を知らないからです.
古いクラスに新しい関数を追加する方法がある場合は、IDEがコードを入力するときに正しい関数を見つけることができます.Kotlinでは、このようにすることができます.
fun String.replaceSpaces(): String {
    return this.replace(' ', '_')
}

val formatted = str.replaceSpaces()

Kotlin標準ライブラリはJavaの元のタイプの機能を拡張しています.これはStringUtils.capitalize()特に必要なものですね.
str.removeSuffix(".txt")
str.capitalize()
str.substringAfterLast("/")
str.replaceAfter(":", "classified")

15#Nullポインタセキュリティ
私たちはよくJava佳作を静的なタイプの言語にします.その中のStringタイプの変数は、Stringオブジェクトを指すことを保証しません.Stringを指す可能性があります.これまでよく行われてきたが,静的タイプ検査によって否定された.その結果、Java開発者は永続的なnull恐怖の中で生きざるを得なかった.
Kotlinは空でないタイプと空でないタイプを区別することによってこの問題を解決する.タイプのデフォルトは空ではありません.ただし、NullPointerExceptionを追加することで空にすることができる.このように:
var a: String = "abc"
a = null                // compile error

var b: String? = "xyz"
b = null                // no problem

Kotlinは、いつでも空のタイプにアクセスするように強制しています.NPEに注意してください.
val x = b.length        // compile error: b might be null

しかし、時にはこれは少し余計に見えるかもしれません.しかし、この特性に多少感謝しなければならない.インテリジェントなタイプ変換があります.いつでも、可能な限り空のタイプを空でないタイプのインテリジェントな変換に変換します.
if (b == null) return
val x = b.length        // no problem

セキュリティコール?も使用できます.NPEを投げ出すのではなく、空のポインタになります.
val x = b?.       // type of x is nullable Int

セキュリティコールはチェーン化できます.これにより、ネストされた?.チェックを回避することができる.私たちは時々他の言語でこのように書きます.if not nullではなく、個別のデフォルト値がほしい場合は、3元オペレータnullを使用します.
val name = ship?.captain?.name ?: "unknown"

もしあなたが好きなものが一つもなかったら、あなたは絶対にNPEが必要です!明示的な質問をしなければなりません.
val x = b?.length ?: throw NullPointerException()  // same as below
val x = b!!.length                                 // same as above

16#より良いLambda
ねえ、これはいいlambdaシステムです.読みやすさと簡潔さを完璧にバランスさせています.賢明な言語設計の選択に感謝しましょう.文法は直接的です.
val sum = { x: Int, y: Int -> x + y }   // type: (Int, Int) -> Int
val res = sum(4,7)                      // res == 11

賢明がどこにあるか見てみましょう
  • lambdaを最後に置くか、メソッドにパラメータが1つしかない場合は、メソッド呼び出しのカッコを削除できます.
  • 単一パラメータのlambdaのパラメータを選択しない場合は、デフォルトの名前は?:です.

  • 上記の説明を合わせると、次の3行のコードが表示されます.
    numbers.filter({ x -> x.isPrime() })
    numbers.filter { x -> x.isPrime() }
    numbers.filter { it.isPrime() }

    これにより、よりシンプルな関数コードを作成できます.その感動的な点を見てみましょう.
    persons
        .filter { it.age >= 18 }
        .sortedBy { it.name }
        .map { it.email }
        .forEach { print(it) }

    Kotlinのlambdaシステムは拡張関数を加え,DSLの作成に理想的な選択となった.Androidが開発したAnkoコードをDSLとして検出した例:
    verticalLayout {
        padding = dip(30)
        editText {
            hint = “Name”
            textSize = 24f
        }
        editText {
            hint = “Password”
            textSize = 24f
        }
        button(“Login”) {
            textSize = 26f
        }
    }

    17#IDEサポート
    Kotlinを上手にしたいなら、いくつかの選択肢があります.しかし、KotlinがセットになったIntelliJを強くお勧めします.その特性はプログラミング言語言語とIDEの設計者が同じグループのメリットであることを説明している.
    小さくて美しい例をあげましょう.Stack OverflowからJavaコードを初めてコピーすると、次のようなダイアログボックスが表示されます.
    拡張読書:
  • 『Kotlin実戦』
  • Kotlin on Android. Now official
  • Why Kotlin is my next programming language
  • Scala vs Kotlin
  • Swift is like Kotlin
  • The Road to Gradle Script Kotlin 1.0
  • Introducing Kotlin support in Spring Framework 5.0
  • 10 cool things about Kotlin
  • Kotlin full stack application example
  • Why I abandoned Java in favour of Kotlin
  • I used Kotlin at Hackathon
  • From Java to Kotlin
  • Kotlin Idioms ​

  • Why you should totally switch to Kotlin