Showing posts with label kotlin. Show all posts
Showing posts with label kotlin. Show all posts

Ketika melakukan perulangan, terkadang kita dihadapkan dengan data yang tak sesuai harapan. Contoh, seperti berikut:


  1. fun main() {

  2.     val listOfInt = listOf(1, 2, 3, null, 5, null, 7)

  3.     for (i in listOfInt) {

  4.         print(i)

  5.     }

  6. }

  7. /*

  8.    output: 123null5null7

  9. */


Proses perulangan pada kode di atas akan menghasilkan nilai null. Jika kita mengelola nilai tersebut, ada potensi NullPointerException di sana. Lalu bagaimana kita melewatkan atau menghentikan proses perulangan jika nilai yang dihasilkan bernilai null? Nah, di sini kita bisa menggunakan Break dan Continue.
Continue digunakan untuk melewatkan proses iterasi dan lanjut dengan proses iterasi berikutnya. Sementara itu, Break digunakan untuk menghentikan proses iterasi.
Berikut adalah contoh proses iterasi pada kode di atas. Kita akan coba melewatkannya jika nilai yang dihasilkan adalah null.

  1. fun main() {

  2.     val listOfInt = listOf(1, 2, 3, null, 5, null, 7)

  3.  

  4.     for (i in listOfInt) {

  5.         if (i == null) continue

  6.         print(i)

  7.     }

  8. }

  9. /*

  10.    output: 12357

  11. */


Pada kode di atas kita menggunakan kata kunci continue. Jika hasil evaluasi expression yang diberikan bernilai true, maka proses iterasi akan dilewatkan dan lanjut ke proses iterasi berikutnya.
Berikut adalah contoh jika kita ingin menghentikan proses iterasi ketika nilai yang dihasilkan bernilai null.

  1. fun main() {

  2.     val listOfInt = listOf(1, 2, 3, null, 5, null, 7)

  3.  

  4.     for (i in listOfInt) {

  5.         if (i == null) break

  6.         print(i)

  7.     }

  8. }


Penggunaan break pada kode di atas akan langsung menghentikan proses iterasi jika variabel i bernilai null.

Break dan Continue Labels

Pada Kotlin, sebuah expression dapat ditandai dengan sebuah label. Label pada Kotlin memiliki sebuah identifier yang diikuti dengan tanda @. Contoh dari sebuah label adalah foo@ atau bar@.
Untuk melabeli sebuah expression, kita cukup menempatkan label di depannya. Contohnya seperti berikut:

  1. fun main() {

  2.     loop@ for (i in 1..10) {

  3.         println("Outside Loop")

  4.  

  5.         for (j in 1..10) {

  6.             println("Inside Loop")

  7.             if ( j > 5) break@loop

  8.         }

  9.     }

  10. }

  11.  

  12. /*

  13.    output :

  14.        Outside Loop

  15.        Inside Loop

  16.        Inside Loop

  17.        Inside Loop

  18.        Inside Loop

  19.        Inside Loop

  20.        Inside Loop

  21. */


Pada kode diatas, break yang sudah ditandai dengan label akan dilompati ke titik awal proses perulangan yang sudah ditandai dengan label. break akan menghentikan proses perulangan terluar dari dalam proses perulangan, di mana break tersebut dipanggil


For Loop

Sama seperti While dan Do WhileFor merupakan konsep perulangan pada blok yang sama selama hasil evaluasi kondisi yang diberikan terpenuhi atau
bernilai true. For dapat digunakan pada RangesCollectionsArrays dan apapun yang menyediakan iterator. Contoh dari For loop sendiri adalah sebagai berikut:

  1. fun main() {

  2.     val ranges = 1..5

  3.     for (i in ranges){

  4.         println("value is $i!")

  5.     }

  6. }

  7.  

  8. /*

  9.    output :

  10.        value is 1!

  11.        value is 2!

  12.        value is 3!

  13.        value is 4!

  14.        value is 5!

  15.  

  16. */


Kode di atas merupakan contoh ketika ketika melakukan perulangan pada Ranges dengan menggunakan range expression yang sudah kita pelajari sebelumnya. Karena menggunakan range expression, kita juga dapat menuliskannya seperti berikut:

  1. fun main() {

  2.     val ranges = 1.rangeTo(5)

  3.     for (i in ranges){

  4.         println("value is $i!")

  5.     }

  6. }

  7.  

  8. /*

  9.    output :

  10.        value is 1!

  11.        value is 2!

  12.        value is 3!

  13.        value is 4!

  14.        value is 5!

  15.  

  16. */


Selain itu, kita juga dapat menuliskan For loop menggunakan range expression seperti berikut:

  1. fun main() {

  2.     val ranges = 1.rangeTo(10) step 3

  3.     for (i in ranges ){

  4.         println("value is $i!")

  5.     }

  6. }

  7.  

  8. /*

  9.    output :

  10.        value is 1!

  11.        value is 4!

  12.        value is 7!

  13.        value is 10!

  14. */


Pada kode di atas, kita menambahkan ekstensi step yang akan mengembalikan nilai baru dengan tipe IntProgression dengan jarak nilai sebelumnya adalah 3.
Kita juga dapat mengakses indeks untuk setiap elemen yang ada pada Ranges dengan memanfaatkan fungsi withIndex() seperti berikut:

  1. fun main() {

  2.     val ranges = 1.rangeTo(10) step 3

  3.     for ((index, value) in ranges.withIndex()) {

  4.         println("value $value with index $index")

  5.     }

  6. }

  7. /*

  8.    output :

  9.        value 1 with index 0

  10.        value 4 with index 1

  11.        value 7 with index 2

  12.        value 10 with index 3

  13. */


Kita menggunakan kata kunci for untuk memulai proses perulangan. Untuk tujuan yang sama, kita juga bisa loh, memanfaatkan salah satu ekstensi pada Kotlin yaitu forEach. Contohnya seperti berikut:

  1. fun main() {

  2.     val ranges = 1.rangeTo(10) step 3

  3.     ranges.forEach { value ->

  4.         println("value is $value!")

  5.     }

  6. }

  7.  

  8. /*

  9.    output :

  10.        value is 1!

  11.        value is 4!

  12.        value is 7!

  13.        value is 10!

  14. */


forEach pada kode di atas merupakan sebuah lambda expression yang hanya memiliki satu argumen yaitu nilai tunggal yang dicakup pada ranges. Jika kita mendapatkan indeks dari tiap nilai yang dicakup kita bisa menggunakan ekstensi forEachIndexed seperti berikut:

  1. fun main() {

  2.  

  3.     val ranges = 1.rangeTo(10) step 3

  4.     ranges.forEachIndexed { index, value ->

  5.         println("value $value with index $index")

  6.     }

  7. }

  8. /*

  9.    output :

  10.        value 1 with index 0

  11.        value 4 with index 1

  12.        value 7 with index 2

  13.        value 10 with index 3

  14. */


forEachIndexed memiliki dua argumen. Pertama adalah index yang merupakan indeks dari tiap nilai. Kedua adalah value yang merupakan nilai tunggal yang dicakup oleh ranges itu sendiri. Jika kita hanya ingin menggunakan argumen index, maka kita bisa mengubah argumen value menjadi _ seperti berikut:

  1. fun main() {

  2.     val ranges = 1.rangeTo(10) step 3

  3.     ranges.forEachIndexed { index, _ ->

  4.         println("index $index")

  5.     }

  6. }

  7. /*

  8.    output :

  9.        index 0

  10.        index 1

  11.        index 2

  12.        index 3

  13. */


Sebenarnya ini merupakan sebuah aturan di mana ketika argumen dari sebuah lambda expression tidak digunakan, kita disarankan agar mengubahnya menjadi _ untuk menggantikan nama dari argumen tersebut.

Seperti yang disampaikan sebelumnya, Range merupakan salah satu tipe yang unik pada kotlin. Kita dapat menentukan nilai awal dan nilai akhir pada Renge. Range direpresentasikan dengan operator .. atau dengan fungsi rangeTo() dan downTo().

Terdapat beberapa cara untuk membuat Range di Kotlin. Pertama, seperti berikut:

  1. val rangeInt = 1..10


Kode diatas menggunakan operator .. untuk membuat Range. Variabel rangeInt di atas mencakup nilai 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Jarak antara dua nilai yang dicakup, ditentukan oleh step. Secara default, step bernilai 1. Untuk mendapatkan step kita bisa menggunakan properti step seperti contoh berikut:

  1. fun main() {

  2.     val rangeInt = 1..10

  3.     print(rangeInt.step)

  4. }

  5.  

  6. /*

  7.    output: 1

  8. */


Dan untuk mengubah nilai dari step bisa dilakukan ketika kita menginisialisasi nilai yang dicakup Range itu sendiri:

  1. fun main() {

  2.     val rangeInt = 1..10 step 2

  3.     rangeInt.forEach {

  4.         print("$it ")

  5.     }

  6.     println(rangeInt.step)

  7. }

  8.  

  9. /*

  10.    output: 1 3 5 7 9 2

  11. */


Pada kode di atas kita menentukan nilai step adalah 2, maka nilai yang dicakup variabel rangeInt adalah 1, 3, 5, 7, 9.
Selanjutnya adalah menggunakan fungsi rangeTo():

  1. val rangeInt = 1.rangeTo(10)


Kode di atas, operator .. digantikan dengan fungsi rangeTo() untuk membuat Range . Nilai yang dicakup pada kode di atas sama seperti kode sebelumnya ketika menggunakan operator ...
Kita juga bisa menentukan nilai yang dicakup pada Range dengan urutan terbalik seperti berikut:

  1. val downInt = 10.downTo(1)


Kode di atas menggunakan fungsi downTo() untuk menentukan nilai dengan urutan terbalik. Variabel downInt di atas mencakup nilai 10, 9, 8, 7, 6, 5, 4, 3, 2, 1.
Kita juga bisa memeriksa apakah suatu nilai ada pada cakupan nilai Range.

  1. fun main() {

  2.     val tenToOne = 10.downTo(1)

  3.     if (7 in tenToOne) {

  4.         println("Value 7 available")

  5.     }

  6. }

  7. /*

  8.    output: Value 7 available

  9. */


Pada kode di atas kita menggunakan kata kunci in untuk memeriksa apakah 7 berada diantara kisaran 1 sampai 10Expression yang dievaluasi pada if di atas sama seperti ketika menggunakan expression berikut:

  1. fun main() {

  2.     if (1 <= 7 && 7 <= 10){

  3.         println("Value 7 available")

  4.     }

  5. }

  6. /*

  7.    output: Value 7 available

  8. */


Nah,  di atas kita telah memeriksa apakah suatu nilai ada pada nilai cakupan Range. Sebaliknya, kita juga bisa memeriksa apakah suatu nilai tidak ada pada nilai cakupan Range tersebut. Kita bisa menggunakan kata kunci !in seperti ini:

  1. fun main() {

  2.     val tenToOne = 10.downTo(1)

  3.     if (11 !in tenToOne) {

  4.         println("No value 11 in Range ")

  5.     }

  6. }

  7. /*

  8.    output: No value 11 in Range

  9. */


Range pada Kotlin mendukung beberapa tipe integral seperti IntRangeLongRange dan CharRange. Sehingga selain nilai numerik, kita juga bisa menentukan tipe Character sebagai nilai yang dicakup oleh Range:

  1. val rangeChar = 'A'.rangeTo('F')


Nilai pada variable rangeChar di atas mencakup A, B, C, D, E, F