Penjelasan Kemalasan
Hitung nilai hanya saat diperlukan.
Penjelasan Kemalasan adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa Itu Evaluasi Malas?
Di Scala, sebagian besar nilai bersifat strict: nilai tersebut dihitung segera setelah Anda mendefinisikannya. Evaluasi malas membalik perilaku ini. Nilai malas hanya dihitung ketika pertama kali diperlukan, tidak pernah sebelumnya.
Hal ini penting ketika perhitungannya mahal, mungkin gagal, atau mungkin sama sekali tidak digunakan. Mengapa melakukan pekerjaan yang tidak diminta siapa pun?
val Strict
val biasa segera mengevaluasi sisi kanannya, meskipun Anda tidak pernah membacanya lagi.
Jalankan ini dan perhatikan bahwa "computing" tercetak sebelum "after". Pekerjaan tersebut terjadi saat definisi dibuat.
object Demo extends App {
val x = { println("computing"); 42 }
println("after")
println(x)
}val lazy
Awali val dengan lazy dan evaluasi akan ditunda hingga akses pertama.
Di sini "after" tercetak lebih dahulu, lalu "computing" hanya ketika x dibaca. Hasilnya juga disimpan di cache: isi tersebut dijalankan paling banyak satu kali.
object Demo extends App {
lazy val x = { println("computing"); 42 }
println("after")
println(x)
println(x)
}Parameter By-name
Parameter yang dideklarasikan sebagai => A diteruskan by name: argumen tidak dievaluasi sampai digunakan di dalam method.
Ini adalah dasar evaluasi malas. LazyList menggunakan parameter by-name agar bagian akhir tidak pernah dihitung sampai diminta.
def maybe(cond: Boolean, value: => Int): Int =
if (cond) value else 0
val r = maybe(false, { println("side"); 99 })
// "side" never prints; value was unusedBerkenalan dengan LazyList
LazyList adalah urutan malas milik Scala (menggantikan Stream yang lebih lama pada 2.13+). Bagian kepalanya dievaluasi dengan segera, tetapi bagian akhirnya bersifat malas.
Elemen dihasilkan sesuai permintaan dan disimpan dalam memo setelah dihitung, sehingga Anda tidak pernah menghitung ulang sel yang sama dua kali.
val ll = LazyList(1, 2, 3)
println(ll)
// prints LazyList(<not computed>) until forcedMemaksa Evaluasi
LazyList tetap belum dievaluasi sampai Anda memaksanya. Memanggil toList, foreach, atau mencetak setiap elemen akan memaksa sel-selnya.
REPL menampilkan <not computed> untuk bagian akhir yang malas. Pemaksaan akan menampilkan nilai sebenarnya.
object Demo extends App {
val ll = LazyList(1, 2, 3)
println(ll.toList)
}Operator #::
Anda menambahkan elemen di awal LazyList dengan #::. Berbeda dari :: pada list, operand kanan #:: bersifat by-name, sehingga bagian akhir tidak dibuat sampai diperlukan.
Dengan demikian, Anda dapat mendeskripsikan urutan yang bagian sisanya dihitung secara malas.
val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.head)Memoisasi
Setelah sebuah sel LazyList dihitung, nilainya disimpan. Membacanya lagi tidak memerlukan biaya, dan ekspresi yang menghasilkannya tidak dijalankan dua kali.
Jalankan ini: "calc" hanya tercetak pada akses pertama setiap elemen yang dipaksa, bukan pada pembacaan berulang.
object Demo extends App {
val ll = LazyList(1, 2).map { n =>
println("calc " + n); n * 10
}
println(ll.head)
println(ll.head)
}Bagian Akhir Malas dalam Praktik
Karena bagian akhir bersifat malas, Anda dapat melakukan map pada LazyList dan hanya elemen yang disentuh yang akan dihitung.
Di sini "map" hanya tercetak sekali meskipun daftar memiliki tiga elemen, karena hanya bagian kepala yang dipaksa.
object Demo extends App {
val r = LazyList(1, 2, 3).map { n =>
println("map " + n); n + 1
}
println(r.head)
}Mengapa Evaluasi Malas Membantu
Evaluasi malas memungkinkan tiga hal: menghindari pekerjaan yang tidak digunakan, membangun urutan tak terbatas, dan memisahkan cara Anda mendeskripsikan perhitungan dari seberapa banyak perhitungan itu dijalankan.
Anda menulis seluruh pipeline sekali; konsumen menentukan berapa banyak elemen yang diambil.
Peringatan
Evaluasi malas memiliki biaya. LazyList menggunakan memo, sehingga menyimpan referensi ke bagian kepalanya membuat setiap elemen yang telah dipaksa tetap berada di memori. Untuk data yang sangat besar atau tak terbatas, hindari menyimpan bagian kepala.
Selain itu, efek samping dalam kode malas berjalan pada waktu yang tidak terduga, yang dapat membingungkan saat melakukan debug.
Pemeriksaan Singkat
Uji pemahaman Anda tentang evaluasi malas.
Ringkasan
Evaluasi strict menjalankan pekerjaan segera; evaluasi malas menundanya sampai diperlukan. lazy val dan parameter by-name (=> A) adalah primitifnya.
LazyList dibangun di atasnya: bagian kepala yang eager, bagian akhir yang lazy dan dimemoisasi, serta pemaksaan melalui toList atau akses elemen. Selanjutnya, kita akan membangun LazyLists secara manual.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penjelasan Kemalasan” gratis?
Ya — teks lengkap “Penjelasan Kemalasan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penjelasan Kemalasan”?
Hitung nilai hanya saat diperlukan. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Penjelasan Kemalasan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Penjelasan Kemalasan
- Membangun LazyList
- Aliran Tak Terbatas
- Mengambil dan Menyaring Secara Malas