Anda di halaman 1dari 32

x

Memulai
Pemrograman
dengan Kotlin
#3
Ahmad Arif Faizin
Academy Content Writer
Dicoding Indonesia
5.
Data Classes dan
Collections
Data Classes
Class untuk menyimpan data

data class User(


val name : String,
val age : Int
) Nama = ......
Umur = …..
...
Hal yang Perlu
Diperhatikan
● Konstruktor utama pada kelas tersebut harus memiliki setidaknya satu parameter;
Tidak boleh : data class User()

● Semua konstruktor utama perlu dideklarasikan sebagai val atau var;


Tidak boleh : data class User(name : String, age : Int)

● Modifier dari sebuah data class tidak bisa abstract, open, sealed, atau inner.
Tidak boleh : open data class User(val name : String, val age : Int)
class vs data class
class User( data class User(
val name : String, val name : String,
val age : Int val age : Int
) )

fun main(){ fun main(){


val user = User("arif", 17) val dataUser = DataUser("arif", 17)
println(user) println(dataUser)
} }

/* /*
output: output:
oo.User@4d7e1886 DataUser(name=arif, age=17)
*/ */
+ toString()
+ equals()
+ copy() dll
Setter & Getter
Mengatur dan mengambil data
data class DataUser(var name : String, var age : Int)

fun main(){
val dataUser = DataUser("arif", 17)
//set data
dataUser.name = "faizin"
dataUser.age = 24
//get data
val name = dataUser.name
val age = dataUser.age

println("My name is $name, I am $age years old")


}
/*
output:
My name is faizin, I am 24 years old
*/
Destructuring Declarations
Membuat banyak variabel sekaligus
data class DataUser(var name : String, var age : Int)

fun main(){
val dataUser = DataUser("arif", 17)
//set data
dataUser.name = "faizin"
dataUser.age = 24
//get data
val (name, age) = dataUser

println("My name is $name, I am $age years old")


}
/*
output:
My name is faizin, I am 24 years old
*/
Collection
Kumpulan dari banyak data

● List : untuk menyimpan nilai bebas dengan index (boleh sama)


val integerList = listOf(4, 2, 1, 5, 1, 2) //Output : [4, 2, 1, 5, 1, 2] Bisa integerList[3]

● Set : untuk menyimpan nilai yang unik


val integerSet = setOf(4, 2, 1, 5, 1, 2) //Output : [4, 2, 1, 5] Tidak Bisa integerSet[3]

● Map : untuk menyimpan dengan format key to value, key unik tidak boleh sama.
val capital = mapOf(
"Jakarta" to "Indonesia",
"London" to "England",
"New Delhi" to "India"
) //Output : {Jakarta=Indonesia, London=England, New Delhi=India} Bisa capital[“Jakarta”]
Bisa capital.getValue(“Jakarta”)
mutablelist vs list
Bisa diubah nilainya Tidak bisa diubah
(mutable) nilainya (immutable)

val anyList = mutableListOf('a', "Kotlin", 3, true, User())

anyList.add('d') // menambah item di akhir list


anyList.add(1, "love") // menambah item pada indeks ke-1
anyList[3] = false // mengubah nilai item pada indeks ke-3
anyList.removeAt(1) // menghapus item User() berdasarkan
index atau posisi nilai di dalam Array
Collection Operator #1
filtering, transformation and ordering

val numberList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)


● filter() & filterNot(): untuk menyaring data berdasarkan kondisi
val evenList = numberList.filter { it % 2 == 0 } // evenList: [2, 4, 6, 8, 10]
val notEvenList = numberList.filterNot { it % 2 == 0 } // notEvenList: [1, 3, 5, 7, 9]

● map(): untuk transformasi (mengubah setiap nilai yang di dalamnya)


val multipliedBy5 = numberList.map { it * 5 } // multipliedBy5: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

● sorted(): untuk mengurutkan data .


val descendingSort = numberList.sortedDescending() // descendingSort: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
val ascendingSort = numberList.sorted() // ascendingSort: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Collection Operator #2
val numberList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
● count(): untuk menghitung jumlah item
numberList.count() // Output: 10

● sum(): untuk menjumlah setiap item


numberList.sum() // Output: 55

● find(): untuk mencari nilai yang memenuhi kondisi


numberList.find { it % 2 == 1 } // Output: 1

● first() /last(): untuk mencari nilai pertama dan terakhir


numberList.first() // Output: 1
numberList.last() // Output: 10
numberList.firstOrNull { it % 2 == 0 } // Output: 2
numberList.lastOrNull { it % 2 == 3 } // Output: null
Sequence
cara efektif untuk memproses data yang besar supaya ringan
● Tanpa Sequence
fun main() {
val list = (1..1000000).toList()
list.filter { it % 5 == 0 }.map { it * 2 }.forEach { println(it) }
}

● Dengan Sequence
fun main() {
val list = (1..1000000).toList()
list.asSequence().filter { it % 5 == 0 }.map { it * 2 }.forEach { println(it) }
}
Kerjakan Latihan
6.
Functional
Programming
Functional
fun getUsername(): List<String>{ fun getUsername(): List<String>{
val name = mutableListOf<String>() return list.map { user ->
for (user in list){ user.name
name.add(user.name) }
} }
return name
}
Anatomy of
Function
parameter yang dikirimkan
nama fungsi ke dalam fungsi
menggunakan nama: tipeData
visibility modifier tipe data nilai
camelCase yang dikembalikan
jika tidak ada
defaultnya
public
private fun setUser(name: String, age: Int): String{
return "Your name is $name, and you $age years old"
}
Named Argument
Contoh :
fun getFullName(first: String, middle: String, last: String): String {
return "$first $middle $last"
}

● Standar
val fullName = getFullName("Kotlin", " is " , "Awesome")

● Dengan Named Argument


val fullName = getFullName(middle = " is " , first = "Kotlin", last = "Awesome")
Default Argument
Contoh :
fun getFullName(first: String = "Kotlin", middle: String = " is ", last: String = "Awesome"): String {
return "$first $middle $last"
}

● Tanpa argument sama sekali


val fullName = getFullName() //output : Kotlin is Awesome

● Salah satu argument


val fullName = getFullName(first = "Dicoding") //output : Dicoding is Awesome
Extension
menambahkan fungsi/properties baru pada fungsi
dasar yang sudah ada
Extension Functions : Extension Properties:

fun Int.plusThree(): Int { val Int.slice: Int


return this + 3 get() = this.div(2)
}

fun main() { fun main() {


println(10.plusThree()) println(10.slice)
} }

/* /*
output : 13 output : 5
*/ */
Nullable Receiver
Extension yang dapat menerima null

Tanpa nullable receiver: Dengan nullable receiver:

val Int.slice: Int val Int?.slice: Int


get() = this.div(2) get() = this?.div(2) ?: 0

fun main() { fun main() {


val value: Int = 10 val value: Int? = null
println(value.slice) println(value.slice)
} }

// output : 5 // output : 0
Lambda
Fungsi tanpa nama yang langsung jadi expression

Tanpa lambda: Dengan lambda:

fun main() { fun main() {


val message = getMessage("Arif") val message = getMessage("Arif")
println(message) println(message)
} }

fun getMessage(name: String): String { val getMessage = { name: String ->


return "Hello $name" "Hello $name"
} }

// output : Hello Arif // output : Hello Arif


High Order Function
Fungsi jadi parameter pada fungsi lainnya
Contoh:

var sum: (Int) -> Int = { value -> value + value } fun main() {
printResult(10){ value ->
fun main() { value + value
printResult(10 ,sum) }
}
= }

fun printResult(value: Int, sum: (Int) -> Int) {


fun printResult(value: Int, sum: (Int) -> Int) {
val result = sum(value) val result = sum(value)
println(result) println(result)
} }

//output : 20 // output : 20
Lambda with Receiver
Teknik untuk memasukkan fungsi di dalam lambda sehingga menjadi
DSL (Domain Specific Language)

- Tanpa DSL: - Dengan DSL


fun main() { fun main() {
val message = buildString() val message = buildString {
println(message) append("Hello ")
} append("from ") receiver
append("lambda ")
fun buildString(): String {
val stringBuilder = StringBuilder()
stringBuilder.append("Hello ")
= }
}
println(message)

stringBuilder.append("from ")
stringBuilder.append("lambda") fun buildString(action: StringBuilder.() -> Unit): String {
return stringBuilder.toString() val stringBuilder = StringBuilder()
} stringBuilder.action()
return stringBuilder.toString()
}
//output : Hello from lambda
//output : Hello from lambda
Scope Function

with
with mirip seperti run
hanya saja ia method
bukan extension.

ex:
with(Foo()) {
this.field1 = 1
this.toBar()
}

*this bisa mengakses fungsi yang di dalamnya, it tidak.


Function Reference
Mengganti fungsi yang menggunakan it dengan menggunakan reference

- Tanpa Reference: - Dengan Reference


fun main() { fun main() {
val numbers = 1.rangeTo(10) val numbers = 1.rangeTo(10)
val evenNumbers = numbers.filter{ val evenNumbers1 = numbers.filter(::isEvenNumber)
isEvenNumber(it) println(evenNumbers)
}
println(evenNumbers) = }

} fun isEvenNumber(number: Int){


return number % 2 == 0
fun isEvenNumber(number: Int){ }
return number % 2 == 0
} //output : Hello from lambda
Advance Collection Operator #3
val number = listOf(1, 2, 3, 4, 5, 6)

● drop(): untuk memangkas item


number.drop(3) // Output: [4, 5, 6]
number.dropLast(3) // Output: [1, 2, 3]

● take(): untuk mengambil item


number.take(2) // Output: [1, 2]
number.takeLast(3) // Output: [5, 6]
Advance Collection Operator #4
val number = listOf(1, 2, 1, 3, 4, 5, 2, 3, 4, 5)

● slice(): untuk mencari nilai yang memenuhi kondisi


val slice = number.slice(2..4)
println(slice)
// Output: [1, 3, 4]

● distinc(): untuk menyaring item yang sama


val distinct = number.distinct()
println(distinct)
// output: [1, 2, 3, 4, 5]
Recursive
val number = listOf(1, 2, 1, 3, 4, 5, 2, 3, 4, 5)

fun main() {
println("Factorial 10 is: ${factorial(3)}")
}

fun factorial(n: Int): Int {


return if (n == 1) {
n
} else {
n * factorial(n - 1)
}
}

// output: 6
// hasil dari 3! = 3 x 2 x 1
Lanjutkan Latihan
&
Terus Belajar!
’’ BERLELAH-LELAHLAH,
SUNGGUH MANISNYA HIDUP TERASA
SETELAH LELAH BERJUANG”.
- Imam Syafi’i

’’
Thanks!
Any questions?
You can find me at:
● Google : Ahmad Arif Faizin
● Discord : @arifaizin

Anda mungkin juga menyukai