Kotlin - Idioms


これは翻訳でよく使われるコートリン慣用句ボールペンの文章です.
コートリンでランダムに使用される慣用句の集合.自分でよく使う慣用語があれば、pull requestで貢献してください.

DTOの作成(POJO/POCO)

data class Customer(val name: String, val email: String)
お客様クラスには、次の機能があります.

  • getters(varの場合setter)のすべての構成

  • equals()

  • hashCode()

  • toString()

  • copy()

  • component1(), component2(), ..., すべてのプログラム(データクラスを参照)
  • 関数パラメータのデフォルト値

    fun foo(a: Int = 0, b: String = "") { ... }

    フィルタリスト

    val positives = list.filter { x -> x > 0 }
    またはそれ以上:
    val positives = list.filter { it > 0 }

    コレクションに要素が存在するかどうかを確認します

    if ("[email protected]" in emailsList) { ... }
    
    if ("[email protected]" !in emailsList) { ... }

    文字列変数の挿入

    println("Name $name")

    インスタンスの確認

    when (x) {
        is Foo -> ...
        is Bar -> ...
        else   -> ...
    }

    読み取り専用リスト

    val list = listOf("a", "b", "c")

    読み取り専用マッピング

    val list = listMap("a", "b", "c")

    アクセスマップ

    println(map["key"])
    map["key"] = value

    マップまたはフェアリストのナビゲート

    for ((k, v) in map) {
        println("$k -> $v")
    }
    kとvは、名前や年齢など、便利な名前に置き換えることができます.

    範囲をまたいで繰り返す

    for (i in 1..100) { ... }  // closed range: includes 100
    for (i in 1 until 100) { ... } // half-open range: does not include 100
    for (x in 2..10 step 2) { ... }
    for (x in 10 downTo 1) { ... }
    (1..10).forEach { ... }

    Lazyプロパティ

    val p: String by lazy {
        // compute the string
    }

    拡張関数

    fun String.spaceToCamelCase() { ... }
    
    "Convert this to camelcase".spaceToCamelCase()

    モノトーンモード

    object Resource {
        val name = "Name"
    }

    抽象クラスインスタンス化

    abstract class MyAbstractClass {
        abstract fun doSomething()
        abstract fun sleep()
    }
    
    fun main() {
        val myObject = object : MyAbstractClass() {
            override fun doSomething() {
                // ...
            }
    
            override fun sleep() { 
            	// ...
            }
        }
        myObject.doSomething()
    }

    If-not-nullショートカット

    val files = File("Test").listFiles()
    
    println(files?.size) // size is printed if files is not null

    If-not-null-else短縮

    val files = File("Test").listFiles()
    
    println(files?.size ?: "empty") // if files is null, this prints "empty"
    
    // To calculate the fallback value in a code block, use `run`
    val filesSize = files?.size ?: run {
        return someSize
    }
    println(filesSize)

    nullの場合は文を実行します

    val values = ...
    val email = values["email"] ?: throw IllegalStateException("Email is missing!")

    空の可能性のあるコレクションの最初のアイテムをインポート

    val emails = ... // might be empty
    val mainEmail = emails.firstOrNull() ?: ""

    非アイドル時運転

    val value = ...
    
    value?.let {
        ... // execute this block if not null
    }

    nullでない場合はnullable値をマッピングします

    val value = ...
    
    val mapped = value?.let { transformValue(it) } ?: defaultValue
    // defaultValue is returned if the value or the transform result is null.

    文に戻るとき

    fun transform(color: String): Int {
        return when (color) {
            "Red" -> 0
            "Green" -> 1
            "Blue" -> 2
            else -> throw IllegalArgumentException("Invalid color param value")
        }
    }

    try-catch expression

    fun test() {
        val result = try {
            count()
        } catch (e: ArithmeticException) {
            throw IllegalStateException(e)
        }
    
        // Working with result
    }

    if expression

    val y = if (x == 1) {
        "one"
    } else if (x == 2) {
        "two"
    } else {
        "other"
    }

    Unitに戻るメソッドのコンストラクタスタイルの使用方法

    fun arrayOfMinusOnes(size: Int): IntArray {
        return IntArray(size).apply { fill(-1) }
    }

    単一式関数

    fun theAnswer() = 42
    上記の関数は次のとおりです.
    fun theAnswer(): Int {
        return 42
    }
    これは、他の慣用語と効果的に結合され、コードをより短くすることができる.たとえば、when式は次のようになります.
    fun transform(color: String): Int = when (color) {
        "Red" -> 0
        "Green" -> 1
        "Blue" -> 2
        else -> throw IllegalArgumentException("Invalid color param value")
    }

    オブジェクトインスタンスから複数のメソッドを呼び出す(with)

    class Turtle {
        fun penDown()
        fun penUp()
        fun turn(degrees: Double)
        fun forward(pixels: Double)
    }
    
    val myTurtle = Turtle()
    with(myTurtle) { //draw a 100 pix square
        penDown()
        for (i in 1..4) {
            forward(100.0)
            turn(90.0)
        }
        penUp()
    }

    オブジェクト属性の設定(適用)

    val myRectangle = Rectangle().apply {
        length = 4
        breadth = 5
        color = 0xFAFAFA
    }

    JAva 7のtry-with-resources

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

    JENICタイプ情報が必要なJENIC関数

    //  public final class Gson {
    //     ...
    //     public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
    //     ...
    
    inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java)

    空入力Boolean

    val b: Boolean? = ...
    if (b == true) {
        ...
    } else {
        // `b` is false or null
    }

    2つの変数を交換

    var a = 1
    var b = 2
    a = b.also { b = a }

    コードを不完全にマークする(TODO)


    Kotlinの標準ライブラリには常にTODO()関数が含まれており、NotImplementedErrorが生成されます.戻りタイプはNothingなので、予想されるタイプにかかわらず使用できます.一部のオーバーロードは原因パラメータを許可します.
    fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")
    IntelliJ IDEAのkotlinプラグインはTODO()の意味を理解し、コードポインタを自動的にTODOツールウィンドウに追加します.