Kotlin Range Expressionsの使用方法

1. 前書き

*範囲は、開始、終了、およびステップで定義される一連の値です*
このクイックチュートリアルでは、Kotlinで範囲を定義して使用する方法について説明します。

2. コトリン範囲の使用

  • Kotlinでは、_rangeTo()_および_downTo()_関数または..を使用して範囲を作成できます。 オペレーター。*

    比較可能なタイプには範囲を使用できます。
    *デフォルトでは、これらは包括的です*。つまり、1..4式は値1,2,3および4に対応します。
    さらに、*もう1つのデフォルトがあります。暗黙の値が1である、ステップと呼ばれる2つの値間の距離*です。
    それでは、範囲を作成し、他の便利なメソッドを使用してそれらを操作するいくつかの例を見てみましょう。

2.1. 範囲を作成する

*範囲は共通インターフェースを実装します– _ClosedRange <T> ._ * _ClosedRange_の結果は、進行__(____ IntProgression、LongProgression、_または_CharProgressionなど)_です。
この進行には、開始、包括的終了、およびステップが含まれ、それは_Iterable <N> _のサブタイプです(Nは_Int、Long_、または_Char_です)。
*「..」および_in_演算子を使用して、範囲を作成する最も簡単な方法を見てみましょう:*
(i in 1..9)
また、後方範囲を定義する場合は、_downTo_演算子を使用できます。
(i in 9 downTo 1)
この式を_if_ステートメントの一部として使用して、値が範囲に属しているかどうかを確認することもできます。
if (3 in 1..9)
  print("yes")

2.2. 反復範囲

*今、私たちは同等のもので範囲を使用できますが、反復したい場合は、整数型の範囲が必要です*
次に、範囲を反復処理するコードを見てみましょう。
for (i in 1.rangeTo(9)) {
    print(i) // Print 123456789
}

for (i in 9.downTo(1)) {
    print(i) // Print 987654321
}
同じ使用例がcharsに適用されます:
for (ch in 'a'..'f') {
    print(ch) // Print abcdef
}

for (ch in 'f' downTo 'a') {
    print(ch) // Print fedcba
}

3. step()関数を使用する

_step()_関数の使用は非常に直感的です。**これを使用して、範囲の値間の距離を定義できます**。
for(i in 1..9 step 2) {
    print(i) // Print 13579
}

for (i in 9 downTo 1 step 2) {
    print(i) // Print 97531
}
この例では、1〜9の値をステップ値2で前後に反復しています。

4. _reversed()_関数を使用する

名前が示すように、_reversed()_関数は範囲の順序を逆にします:
(1..9).reversed().forEach {
    print(it) // Print 987654321
}

(1..9).reversed().step(3).forEach {
    print(it) // Print 963
}

5. _until()_関数の使用

終了要素を除外する範囲を作成する場合、_until():_を使用できます。
for (i in 1 until 9) {
    print(i) // Print 12345678
}

6. _last、first、step_要素

範囲の最初、ステップ、または最後の値を見つける必要がある場合、それらを返す関数があります。
print((1..9).first) // Print 1
print((1..9 step 2).step) // Print 2
print((3..9).reversed().last) // Print 3

7. フィルタリング範囲

_filter()_関数は、指定された述語に一致する要素のリストを返します。
val r = 1..10
val f = r.filter { it -> it % 2 == 0 } // Print [2, 4, 6, 8, 10]
_map()_や_reduce()_などの他の関数を範囲に適用することもできます。
val m = r.map { it -> it * it } // Print [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
val rdc = r.reduce{a, b -> a + b} // Print 55

8. その他のユーティリティ関数

range_min、max、sum、average、count、distinct_など、範囲に適用できる他の多くの関数があります。
val r = 1..20
print(r.min()) // Print 1
print(r.max()) // Print 20
print(r.sum()) // Print 210
print(r.average()) // Print 10.5
print(r.count()) // Print 20

val repeated = listOf(1, 1, 2, 4, 4, 6, 10)
print(repeated.distinct()) // Print [1, 2, 4, 6, 10]

9. カスタムオブジェクト

*カスタムオブジェクト上に範囲を作成することもできます。*そのための唯一の要件は、_Comparable_インターフェイスを拡張することです。
列挙型が良い例です。 Kotlinのすべての列挙型は_Comparable_を拡張します。つまり、デフォルトでは、要素は表示される順序でソートされます。
簡単な_Color_ enumを作成しましょう:
enum class Color(val rgb: Int) : Comparable<Color> {
    BLUE(0x0000FF),
    GREEN(0x008000),
    RED(0xFF0000),
    MAGENTA(0xFF00FF),
    YELLOW(0xFFFF00);
}
そして、いくつかの_if_ステートメントで使用します:
val range = red..yellow
if (range.contains(Color.MAGENTA)) println("true") // Print true
if (Color.RED in Color.GREEN..Color.YELLOW) println("true") // Print true
if (Color.RED !in Color.MAGENTA..Color.YELLOW) println("true") // Print true
ただし、これは整数型ではないため、反復することはできません。 試みると、コンパイルエラーが発生します。
fun main(args: Array<String>) {
    for (c in Color.BLUE.rangeTo(Color.YELLOW)) println(c) // for-loop range must have an iterator() method
}
繰り返し可能なカスタム範囲が必要な場合は、_ClosedRange _と_Iterator._を実装するだけです。

10. 結論

この記事では、Kotlinで範囲式を使用する方法と、適用できるさまざまな関数を示しました。
いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-kotlin-2[GitHub上]で入手できます。