Kotlin range
1. Giới thiệu
Biểu thức range(phạm vi) ..
là một dạng của function rangeTo
và sử dụng với toán tử in
hoặc !in
. Range được định nghĩa cho bất kỳ kiểu dữ liệu có thể so sánh nào. Tuy nhiên, nó được tối ưu với kiểu dữ liệu kiểu nguyên:
Toàn bộ kiểu phạm vi (IntRange
, LongRange
, CharRange
) có thể được dùng để duyệt bằng cách sử dụng vòng lặp for
:
Để duyệt ngược, ta sử dụng function downTo()
được định nghĩa trong thư viện chuẩn
Java
Kotlin
Để duyệt với bước nhảy k phải là 1, ta sử dụng function step()
Java
Kotlin
Để duyệt và ngoại trừ phần tử cuối cùng, ta sử dụng function until
Java
Kotlin
2. Cách hoạt động
Ranges implement một interface trong thư viện: ClosedRange<T>
ClosedRange<T>
biểu thị một khoảng kín với các kiểu dữ liệu có thể so sánh được. Nó có 2 endpoint: start
và endInclusive
, cái mà được bao gồm trong khoảng đó. Function sử dụng chính là contains
, thường được sử dụng dưới dạng toán tử in
hoặc !in
.
Progression với các dữ liệu kiểu nguyên (IntProgression
, LongProgression
, CharProgression
) biểu thị một tiến trình số học. Progression được định nghĩa bởi phần tử first
, phần tử last
và một step
khác 0. Phần tử đầu tiên là first
, phần tử tiếp theo là first
+ step
.
Progression là lớp con của Iterable<N>
, với N
là kiểu Int
, Long
, Char
. Bởi vậy chúng có thể được dùng với vòng lặp for
và các function như map
, filter
, ... Việc duyệt qua Progression
tương tự như vòng lặp for
có chỉ số trong Java hoặc JavaScript:
Với kiểu dữ liệu kiểu nguyên, toán tử ..
tạo một đối tượng cả ClosedRange<T>
và *Progression
. VD: IntRange
implement ClosedRange<Int>
và kế thừa IntProgression
, do đó các toán tử được định nghĩa cho IntProgression
cũng có thể hiệu lực với IntRange
. Kết quả của các function downTo()
và step()
luôn luôn là một *Progression
.
Progression được tạo ra bởi function fromClosedRange
được định nghĩa bên trong companion object.
Phần tử last
của progression được tính toán để tìm được giá trị lớn nhất không lớn hơn giá trị end
với step
>0 hoặc không nhỏ hơn giá trị end
với step
< 0 : (last - first) % step == 0
3. Các function hữu ích
rangeTo()
Toán tử rangeTo()
với kiểu dữ liệu nguyên đơn giản sẽ gọi hàm tạo của các class *Range
Các số thực (Double
, Float
) không định nghĩa các toán tử rangeTo()
mà được cung cấp bởi thư viện chuẩn cho kiểu Comparable
Bởi vậy, không thể duyệt với các số thực.
downTo()
Extension function downTo()
được định nghĩa với kiểu số nguyên
reversed()
Extension function reversed()
được định nghĩa cho các lớp *Progression
và chúng trả về các progression ngược:
step()
Các extension function step()
được định nghĩa cho các lớp *Progression
, tất cả chúng trả về một progression với giá trị step
được truyền vào. Giá trị của step
cần là một số dương để function không bao giờ có thể thay đổi được hướng duyệt
Lưu ý rằng giá trị last
của progression trả về có thể khác so với giá trị last
của progression ban đầu để giữ lại sự bất biến: