Tutorial Skala

โšก Ringkasan Cerdas

Tutorial Scala memperkenalkan bahasa berbasis JVM dengan tipe statis yang menyatukan pemrograman berorientasi objek dan fungsional. Panduan ini mencakup instalasi, sintaksis, fitur inti, dan kerangka kerja yang menjadikan Scala ideal untuk membangun aplikasi modern yang konkuren, terukur, dan ringkas.

  • ๐Ÿ”˜ Paradigma Hibrida: Scala memadukan pemrograman berorientasi objek dan fungsional pada JVM, memungkinkan pengembang untuk menggabungkan immutabilitas, fungsi kelas satu, dan hierarki kelas tradisional.
  • โ˜‘๏ธ Sintaksis Ringkas: Inferensi tipe, fungsi anonim, dan pencocokan pola mengurangi kode berulang dibandingkan dengan Java sementara tetapping Kode tersebut ekspresif dan mudah dibaca.
  • โœ… Pengaturan dengan IntelliJ: Instal IDE Community Edition, tambahkan plugin Scala, dan buat Objek yang memperluas App untuk menjalankan program Hello World pertama.
  • ๐Ÿงช Blok Bangunan Fungsional: Evaluasi tunda (lazy evaluation), currying, fungsi tingkat tinggi (higher-order functions), dan immutabilitas melalui val mendukung kode yang bersih dan mudah diprediksi.
  • ๏ธ Konkurensi dan Kerangka Kerja: Aktor Akka, Masa Depan, Bermain, Angkat, dan Spark menjadikan Scala pilihan yang tepat untuk sistem terdistribusi, aplikasi web, dan rekayasa data.

Tutorial Skala

Apa itu Scala?

Scala Scala adalah bahasa pemrograman bertipe statis yang menggabungkan pemrograman berorientasi objek dan fungsional untuk meningkatkan skalabilitas aplikasi. Scala terutama berjalan di platform JVM, dan pengembang juga dapat menggunakannya untuk menulis perangkat lunak untuk platform asli melalui Scala-Native, atau untuk browser melalui ScalaJs dan JavaNaskah waktu berjalan.

Scala adalah bahasa yang skalabel yang digunakan untuk membangun perangkat lunak untuk berbagai platform, dan itulah sebabnya bahasa ini mendapatkan namanya. Bahasa ini dirancang untuk mengatasi beberapa masalah kerumitan yang ditemukan dalam Java sambil tetap ringkas. Martin Odersky merancang Scala, dan rilis publik pertamanya muncul pada tahun 2004.

Mengapa belajar Scala

Berikut adalah alasan utama untuk mempelajari bahasa pemrograman Scala:

  • Scala mudah dipelajari bagi programmer berorientasi objek dan Java Para pengembang, dan bahasa ini telah menjadi salah satu bahasa populer dalam beberapa tahun terakhir.
  • Scala menawarkan fungsi-fungsi kelas satu bagi para pengguna.
  • Scala dapat dieksekusi pada FMV, membuka jalan bagi interoperabilitas dengan bahasa lain.
  • Bahasa ini dirancang untuk aplikasi yang bersifat konkuren, terdistribusi, dan tangguh berbasis pesan, yang menjadikannya salah satu bahasa yang paling banyak diminati dekade ini.
  • Ini adalah bahasa yang ringkas dan ampuh yang dapat berkembang dengan cepat sesuai dengan kebutuhan penggunanya.
  • Bahasa pemrograman ini berorientasi objek dan mencakup banyak fitur pemrograman fungsional, memberikan banyak fleksibilitas kepada pengembang dalam cara mereka menulis kode.
  • Scala menawarkan Duck Typing melalui tipe struktural.
  • Ini memiliki lebih sedikit kalimat standar daripada Java.
  • Framework Lift dan Play, yang ditulis dalam Scala, terus berkembang dan semakin populer.

Bagaimana cara menginstal Scala

Untuk mulai menulis program Scala, Anda perlu menginstalnya di komputer Anda. Untuk melakukan ini, kunjungi situs resminya di [alamat situs]. https://www.scala-lang.org/download/ untuk mengunduh versi Scala terbaru.

Setelah mengikuti tautan tersebut, Anda akan diberikan dua pilihan untuk menginstal Scala. Untuk tutorial Scala ini, kita akan menggunakan IntelliJ IDEAyang menyediakan dukungan Scala yang sangat baik secara langsung.

Bagaimana cara menginstal Scala

Setelah Anda mengunjungi tautan unduhan, Anda akan menemukan dua edisi IDE IntelliJ.

Untuk tutorial Scala ini, kita akan mengunduh Community Edition, yang gratis dan mencakup semua yang Anda butuhkan untuk menulis program Scala.

Halaman unduhan IntelliJ Community Edition

Langkah 1) Pilih Edisi Komunitas.
Di halaman tersebut, klik menu tarik-turun pada Edisi Komunitas.

Ini menyajikan opsi untuk mengunduh IDE IntelliJ bersama dengan JBR, yang berisi implementasi JDK (Java (Development Kit) seperti OpenJDK yang dibutuhkan Scala untuk mengkompilasi dan menjalankan kode.

Unduh IntelliJ dengan JBR

Langkah 2) Jalankan instalasi.
Setelah Anda mengunduh IntelliJ, klik dua kali file instalasi dan ikuti panduan yang muncul di layar.

Panduan instalasi IntelliJ

Langkah 3) Pilih lokasi.
Pilih lokasi untuk menginstal IDE.

Pilih folder instalasi

Jika Anda tidak mengunduh paket yang menyertakan JDK, penginstal tetap akan meminta Anda untuk menambahkan JDK melalui kotak centang selama proses pengaturan.

centang kotak JDK selama instalasi

Langkah 4) Klik Berikutnya.
Biarkan pengaturan default lainnya apa adanya dan klik Berikutnya.

Opsi default penginstal

Program Scala Halo Dunia

Langkah 5) Klik ikon startup.
Setelah instalasi selesai, jalankan IntelliJ IDE dengan mengklik ikon startup-nya di menu Mulai seperti aplikasi biasa.

Layar selamat datang IntelliJ

Anda masih perlu menambahkan plugin Scala ke IntelliJ. Klik menu tarik-turun pada menu konfigurasi di bagian kanan bawah layar dan pilih opsi Plugin.

Konfigurasi menu untuk plugin

Pasar plugin IntelliJ

Pada tab Marketplace, cari Scala. Plugin tersebut akan muncul sebagai hasil pertama di bawah tag Languages.

Langkah 6) Pasang plugin.
Klik Instal untuk memulai pengunduhan plugin Scala.

Instal plugin Scala

Langkah 7) Restart IDE.
Setelah pengunduhan selesai, Anda akan diminta untuk memulai ulang IDE agar plugin yang terpasang dapat mulai berfungsi.

Mulai ulang prompt IntelliJ.

Setelah memulai ulang, Anda kembali ke halaman yang sama seperti sebelumnya, tetapi sekarang plugin Scala sudah terpasang dan siap digunakan.

Langkah 8) Pilih Buat Proyek, yang akan mengarahkan Anda ke halaman tempat Anda dapat memilih bahasa untuk proyek tersebut.

Buat proyek baru di IntelliJ

Langkah 9) Pilih Scala dengan mencentang kotak centang Scala dan klik Berikutnya.

Pilih bahasa Scala

Langkah 10) Pilih lokasi untuk menyimpan file proyek dan beri nama proyek tersebut.

Sebutkan nama dan lokasi proyek.

Jika direktori tersebut tidak ada, IntelliJ akan meminta izin untuk membuat folder tersebut. Terima dan klik Selesai. Anda kemudian akan dibawa ke proyek Scala Anda, yang saat ini belum berisi kode Scala apa pun.

Dibutuhkan waktu untuk memuat indeks, jadi jangan khawatir jika Anda tidak dapat berinteraksi dengan IDE saat bilah kemajuan muncul di bagian bawah. IDE sedang memuat file yang diperlukan untuk menjalankan Scala dan menyediakan fitur pelengkapan otomatis.

Langkah 11) Klik tab Proyek di sebelah kiri IDE dan perluas untuk melihat isi proyek.

Perluas tab proyek

Pada tahap ini, proyek masih kosong dan hanya berisi folder .idea dan file hello-world.iml yang dihasilkan oleh IDE. Bagian yang menarik adalah folder src, yang berisi kode sumber proyek. Di sinilah Anda membuat file Scala pertama Anda.

Langkah 12) Klik kanan pada src untuk membuka menu dan membuat file Scala baru.

Buat file Scala baru

Pilih nama untuk file tersebut. Untuk tutorial Scala ini, gunakan haloKemudian, pilih Object dari menu tarik-turun untuk tipe konten file Scala.

Pilih jenis Objek

Setelah Anda melakukan ini, Anda akan memiliki file Scala yang berisi objek singleton yang akan Anda gunakan untuk menjalankan kode tersebut.

Objek Singleton dibuat

Sekarang setelah Anda memiliki file Scala dengan objek Hello, tulis program pertama Anda dengan memperluas objek yang telah Anda buat menggunakan kata kunci App.

Dengan menambahkan kelas App ke dalam objek, kompiler akan mengetahui kode mana yang akan dijalankan saat program dimulai. Segera setelah menambahkan App, panah hijau akan muncul di sisi kiri, menunjukkan bahwa program sekarang dapat dijalankan.

Jalankan panah di IntelliJ

Jalankan opsi Hello

Di dalam objek Hello, tulis fungsi println() untuk mencetak teks ke konsol. Jalankan program dengan mengklik panah hijau.

Mengklik panah akan menampilkan opsi Jalankan Hello. Memilih opsi tersebut akan mengkompilasi kode, dan setelah beberapa detik output program akan muncul di konsol IntelliJ.

Output "Hello World" di konsol

Anda kini telah berhasil menginstal Scala dan menjalankan program pertama Anda.

Apa yang dapat Anda lakukan dengan Scala

Scala banyak digunakan di berbagai bidang karena fleksibilitas dan interoperabilitasnya dengan JVM. Contoh penggunaan umum meliputi:

  • Pengembangan web frontend dengan ScalaJS.
  • Pengembangan aplikasi seluler untuk Android dan iOS dengan Scala Native.
  • Pustaka sisi server seperti HTTP4S, Akka-Http, dan Play Framework.
  • Aplikasi Internet of Things (IoT).
  • Pengembangan permainan.
  • Pemrosesan Bahasa Alami menggunakan rangkaian pustaka ScalaNLP.
  • Mempraktikkan teknik-teknik tingkat lanjut seperti pemrograman fungsional dan pemrograman berorientasi objek secara bersamaan.
  • Aplikasi komunikasi konkuren tinggi menggunakan aktor, sebuah pustaka untuk JVM yang terinspirasi oleh Erlang.
  • Pembelajaran mesin dengan pustaka seperti Figaro untuk pemrograman probabilistik dan Apache. Spark untuk pemrosesan data skala besar.

Fungsi Anonim

Bahasa Scala mendukung fungsi anonim, yang juga disebut literal fungsiKarena Scala adalah bahasa fungsional, pengembang sering memecah masalah besar menjadi banyak tugas kecil dan membuat banyak fungsi. Untuk mempermudah hal ini, Scala memungkinkan fungsi untuk dipakai tanpa namaAnda dapat menetapkannya langsung ke variabel atau ke definisi menggunakan def, seperti yang ditunjukkan pada contoh Scala berikut:

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n * 3

Anda kemudian dapat menggunakannya seperti fungsi biasa dengan memberikan parameter:

multiplyByTwo(3)
//6

multiplyByThree(4)
//12

Metode-metode ini sangat berguna ketika Anda menginginkan kode yang bersih dan ringkas. Fungsi anonim berguna saat mendefinisikan metode yang kecil dan tidak memerlukan banyak kode di dalamnya. Fungsi ini sangat sederhana dan tidak memerlukan proses yang rumit untuk dibuat.

Metode-metode ini tidak terbatas pada fungsi yang memiliki argumen dan dapat digunakan untuk membuat instance metode yang tidak memiliki argumen.

val sayHello = () => { println("hello") }

Sebagian besar fungsi anonim ini digunakan di bagian kode lain di mana Anda membutuhkan fungsi cepat. Karena alasan ini, fungsi-fungsi tersebut juga disebut sebagai fungsi sebarisPenggunaan fungsi anonim adalah pola umum yang muncul di seluruh pustaka koleksi untuk melakukan tindakan cepat pada sebuah koleksi.

Sebagai contoh, metode filter menggunakan fungsi inline untuk membuat koleksi lain yang hanya berisi elemen-elemen yang memenuhi kriteria yang didefinisikan dalam fungsi anonim.

val myList = List(1,2,3,4,5,6,7)

val myEvenList = myList.filter((n: Int) => n % 2 == 0)
//List(2,4,6)

val myOddList = myList.filter((n:Int) => n % 2 != 0)
//List(1,3,5,7)

Di sini, fungsi anonim memeriksa apakah nilai dari daftar tersebut ganjil atau genap dan mengembalikan item yang sesuai.

//the one checking that the value is even
(n: Int) => n % 2 == 0

//the one checking that the value is odd
(n:Int) => n % 2 != 0

Di Scala, dimungkinkan juga untuk menggunakan wildcard di mana parameter fungsi anonim tidak diberi nama. Misalnya:

var timesTwo = (_:Int) * 2

timesTwo(5)
//10

Dalam skenario ini, Anda tidak perlu menyebutkan nama parameter. Garis bawah digunakan untuk mewakilinya.

Evaluasi Malas

Sebagian besar bahasa pemrograman mengevaluasi variabel dan parameter fungsi secara berurutan, satu per satu. Di Scala, kata kuncinya adalah... lazy Membantu menangani nilai-nilai yang tidak ingin Anda evaluasi sampai nilai tersebut dirujuk.

Variabel yang ditandai sebagai lazy tidak dievaluasi di tempat variabel tersebut didefinisikan, yang umumnya dikenal sebagai evaluasi eager. Variabel tersebut hanya dievaluasi ketika dirujuk kemudian dalam kode.

Ini dapat bermanfaat ketika mengevaluasi suatu nilai akan menjadi komputasi yang mahal. Jika nilai tersebut tidak selalu dibutuhkan, Anda menghemat waktu dan biaya komputasi yang dapat memperlambat perangkat lunak dengan membuat variabel tersebut bersifat malas (lazy).

lazy val myExpensiveValue = expensiveComputation

def runMethod() = {
    if(settings == true) {
        use(myExpensiveValue)
    } else {
        use(otherValue)
    }
}

Ini bukan satu-satunya kegunaan variabel malas (lazy variables). Variabel ini juga membantu mengatasi ketergantungan siklik dalam kode.

Jika flag pengaturan bernilai false, Anda tidak perlu menggunakan myExpensiveValue, yang menghemat komputasi yang mahal. Ini membantu memastikan pengguna memiliki pengalaman yang lancar karena sumber daya tidak terbuang untuk nilai yang tidak pernah dibaca.

Kemalasan juga membantu dalam argumen fungsi, di mana argumen hanya digunakan ketika dirujuk di dalam fungsi. Konsep ini disebut parameter panggilan berdasarkan nama (call-by-name).

def sometimesUsedString(someValue:String, defaultValue: => String) = {
 if(someValue != null) {
   use(defaultValue)
 } else {
   use(someValue)
   }
 }

Banyak bahasa pemrograman menggunakan pendekatan call-by-value untuk mengevaluasi argumen. Parameter yang dilewatkan melalui call-by-name hanya dievaluasi ketika dibutuhkan di dalam badan fungsi. Setelah nilainya dievaluasi, nilai tersebut disimpan dan dapat digunakan kembali nanti tanpa evaluasi ulang, sebuah konsep yang dikenal sebagai memoization.

Ketik Inferensi

Di Scala, Anda tidak perlu mendeklarasikan tipe untuk setiap variabel yang Anda buat karena kompiler Scala dapat menyimpulkan tipe dari sisi kanan suatu ekspresi. Hal ini memungkinkan kode Anda menjadi lebih ringkas dan membebaskan Anda dari menulis kode berulang di mana tipe yang diharapkan sudah jelas.

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compiler infers that third is of type String

Fungsi Tingkat Tinggi

Fungsi tingkat tinggi adalah fungsi yang dapat menerima fungsi sebagai argumen dan dapat mengembalikan fungsi sebagai tipe kembalian. Di Scala, fungsi dianggap sebagai warga negara kelas satu. Menggunakan fungsi dengan cara ini memungkinkan Anda untuk sangat fleksibel dalam jenis program yang dapat Anda bangun. Anda dapat membuat fungsi secara dinamis dan memberikan fungsionalitas secara dinamis ke fungsi lain.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int = {
    myMathFunction(n)
}

Dalam fungsi di atas, Anda memasukkan sebuah Int dan sebuah fungsi yang menerima sebuah Int dan mengembalikan sebuah IntAnda dapat memasukkan fungsi apa pun dengan tanda tangan tersebut. Yang dimaksud dengan tanda tangan adalah input dan output fungsi. Tanda tangan dari Int => Int Artinya, sebuah fungsi menerima input berupa bilangan bulat (Int) dan mengembalikan output berupa bilangan bulat (Int).

Tanda tangan dari () => Int Artinya, sebuah fungsi tidak menerima input apa pun dan mengembalikan nilai Int sebagai outputnya. Contoh fungsi seperti itu adalah fungsi yang menghasilkan bilangan bulat acak.

def generateRandomInt() = {
 return scala.util.Random.nextInt()
}

Fungsi di atas memiliki tanda tangan () => Int.

Suatu fungsi juga dapat memiliki tanda tangan. () => UnitArtinya, fungsi tersebut tidak menerima input apa pun dan tidak mengembalikan tipe data. Fungsi tersebut mungkin malah mengubah beberapa status atau melakukan tindakan yang telah ditentukan sebelumnya.

Metode semacam ini tidak disarankan karena dapat bertindak sebagai kotak hitam yang memengaruhi sistem dengan cara yang tidak diketahui. Metode ini juga lebih sulit untuk diuji. Memiliki tipe input dan output yang eksplisit memungkinkan Anda untuk memahami apa yang dilakukan fungsi Anda.

Fungsi tingkat tinggi juga dapat mengembalikan fungsi. Misalnya, Anda dapat membuat metode yang mengembalikan fungsi pemangkatan, yaitu fungsi yang menerima sebuah angka dan memberikan pangkat padanya.

def powerByFunction(n:Int): Int=>Int = {
  return (x:Int) => scala.math.pow(x,n).toInt
}

Fungsi di atas menerima nilai Int. Tipe kembaliannya adalah fungsi anonim yang menerima nilai Int. x dan menggunakannya sebagai argumen untuk fungsi pangkat.

kari

Di Scala, Anda dapat mengubah fungsi yang menerima dua argumen menjadi fungsi yang menerima satu argumen pada satu waktu. Saat Anda memasukkan satu argumen, Anda menerapkannya sebagian dan menghasilkan fungsi yang menerima argumen yang tersisa untuk menyelesaikan panggilan. Currying memungkinkan Anda membangun fungsi dengan menambahkan beberapa argumen secara parsial.

Ini berguna untuk membuat fungsi secara dinamis sebelum Anda memiliki serangkaian argumen yang lengkap.

def multiplyTwoNumbers(n:Int)(m:Int): Int = {
  return n * m
}

Jika Anda memerlukan fungsi yang mengalikan dengan angka tertentu, Anda tidak perlu membuat metode perkalian lain. Anda dapat menerapkan satu argumen ke fungsi curried dan menggunakan kembali hasilnya:

def multiplyTwoNumbers(n:Int)(m:Int): Int = {
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) _

multiplyByFive(4)

//returns 20

Pencocokan Pola

Scala memiliki mekanisme bawaan yang ampuh yang membantu Anda memeriksa apakah suatu variabel sesuai dengan kriteria tertentu, mirip dengan pernyataan switch di Java atau rangkaian pernyataan if/else. Bahasa ini mendukung pencocokan pola, yang dapat Anda gunakan untuk memeriksa apakah suatu variabel bertipe tertentu. Pencocokan pola di Scala sangat ampuh dan dapat memecah komponen yang memiliki unapply Metode untuk mendapatkan kolom yang Anda butuhkan langsung dari variabel yang dicocokkan.

Pencocokan pola Scala juga memberikan sintaks yang lebih menyenangkan daripada pernyataan switch.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

Anda membandingkan variabel dengan serangkaian opsi. Ketika variabel memenuhi kriteria, ekspresi di sisi kanan tanda panah tebal (=>) dievaluasi dan dikembalikan sebagai hasil kecocokan.

Garis bawah (_) menangkap kasus-kasus yang tidak cocok dalam kode, meniru perilaku kasus default dalam pernyataan switch.

class Animal(var legs:Int, var sound:String)
class Furniture(var legs:Int, var color:Int, var woodType:String)

myItem match {
case myItem:Animal => //do something
case myItem:Furniture => //do something else
case _ => //unknown type, do something else
}

Pada kode di atas, Anda dapat mendeteksi tipe dari myItem variabel dan, berdasarkan itu, bercabang ke kode spesifik.

Pencocokan pola memeriksa apakah variabel tersebut cocok dengan setiap kasus secara berurutan.

Garis bawah berfungsi sebagai penanda tempat yang cocok dengan kondisi apa pun yang tidak dipenuhi oleh pernyataan case lainnya. Anda mengambil sebuah variabel. myItem dan menelepon match Metode.

  • Periksa apakah myItem is true dan jalankan logika di sisi kanan tanda panah tebal โ€œ=>โ€.
  • Gunakan garis bawah untuk mencocokkan apa pun yang tidak sesuai dengan pernyataan case yang didefinisikan dalam kode.

Dengan case class, Anda dapat melakukan destrukturisasi kelas untuk mengekstraknya.trackolom t di dalam objek.

Dengan menggunakan sealed Dengan menggunakan kata kunci untuk mendefinisikan kelas, Anda mendapatkan manfaat dari kompiler yang secara menyeluruh memeriksa kasus-kasus yang Anda coba cocokkan dan memperingatkan Anda jika Anda lupa menangani salah satunya.

Kekekalan

Dimungkinkan untuk membuat nilai yang tidak dapat diubah oleh fungsi lain di Scala dengan menggunakan val kata kunci. Hal ini dicapai dengan Java dengan menggunakan final kata kunci. Di Scala, Anda menggunakan sebuah val saat membuat variabel, bukan var, yang merupakan alternatif untuk variabel yang dapat diubah.

Variabel yang didefinisikan menggunakan val kata kunci bersifat hanya baca, sedangkan yang didefinisikan dengan var dapat dibaca dan diubah kemudian oleh fungsi lain atau oleh pengguna dalam kode.

var changeableVariable = 8

changeableVariable = 10
//the compiler does not complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//this will not compile

Mencoba menetapkan nilai ke myNumber setelah menyatakannya sebagai val Menimbulkan kesalahan kompilasi: โ€œpenugasan ulang ke val.โ€

Mengapa menggunakan Kekekalan?

Sifat tidak dapat diubah (immutability) membantu mencegah kode dan programmer lain mengubah nilai secara tidak terduga, yang dapat menyebabkan hasil yang tidak dapat diprediksi. Jika pengguna suatu nilai perlu mengubahnya, mereka dapat membuat salinannya. Dengan cara ini, bug yang disebabkan oleh banyak pihak yang mengubah variabel yang sama dapat dicegah.

Kelas dan Objek

Objek adalah entitas dunia nyata, dan kelas adalah templat yang mendefinisikan objek. Kelas memiliki keadaan dan perilaku. Keadaan tersebut berupa nilai atau variabel. Perilaku tersebut adalah metode dalam Scala.

Bagian selanjutnya menunjukkan cara mendefinisikan kelas, membuat instance-nya, dan menggunakannya di Scala.

Berikut adalah kelas bernama Rectangle yang memiliki dua nilai dan dua fungsi. Anda juga dapat menggunakan parameternya. l ke b langsung sebagai field dalam program. Anda memiliki sebuah objek yang memiliki metode main dan menginstansiasi kelas dengan dua nilai.

Contoh:

class Rectangle(l: Int, b: Int) {
  val length: Int = l
  val breadth: Int = b
  def getArea: Int = l * b
  override def toString = s"This is a rectangle with length $length and breadth $breadth"
}
object RectObject {
  def main(args: Array[String]) {
    val rect = new Rectangle(4, 5)
    println(rect.toString)
    println(rect.getArea)
  }
}

Semua field dan method bersifat publik secara default di Scala. Penting untuk menggunakannya. override karena toString sudah didefinisikan untuk setiap objek di Scala.

Warisan

Scala memiliki beberapa jenis pewarisan (tunggal, bertingkat, ganda, hierarkis, dan hibrida) yang memiliki banyak kesamaan dengan bentuk tradisional yang ditemukan di JavaAnda dapat mewarisi baik dari kelas maupun dari trait. Anda mewarisi anggota dari satu kelas ke kelas lain menggunakan kata kunci `inherit`. extendsHal ini memungkinkan penggunaan kembali.

Dimungkinkan untuk mewarisi dari satu kelas atau beberapa kelas. Dimungkinkan juga untuk mewarisi dari subkelas yang memiliki superkelasnya sendiri, sehingga menciptakan hierarki pewarisan dalam prosesnya.

Dalam contoh Scala di bawah ini, kelas dasarnya adalah Circle, dan kelas turunannya adalah SphereSebuah lingkaran memiliki nilai yang disebut jari-jari, yang diwarisi dalam kelas Bola. Metode calcArea ditimpa menggunakan kata kunci override.

Contoh:

class Circle {
  val radius = 5
  def calcArea = {
    println(radius * radius)
  }
}
class Sphere extends Circle {
 override def calcArea = {
    println(radius * radius * radius)
  }
}
  object SphereObject {
    def main(args : Array[String]) {
      new Sphere().calcArea
    }
  }

Abstracproduksi

Di Scala, Anda dapat membuat abstracmetode t dan bidang anggota menggunakan abstracKelas dan ciri-ciri t. Di dalam abstrackelas dan sifat, Anda dapat mendefinisikan abstracbidang t tanpa mengimplementasikannya.

Contoh:

trait MakesSound {
    var nameOfSound:String
    def sound():String
}
abstract class HasLegs(var legs:Int) {
    val creatureName:String

    def printLegs():String = {
        return s"$creatureName has this number of legs: $legs"
    }
}

Bidang-bidang ini diimplementasikan oleh kelas-kelas yang memperluas trait atau abs.trackelas t. Anda dapat menggunakan trait untuk membuat contracTentukan apa yang seharusnya dilakukan oleh sebuah aplikasi, lalu implementasikan metode-metode tersebut di kemudian hari.

trait DatabaseService {
    def addItemName(itemName:String)
    def removeItem(itemId:Int)
    def updateItem(itemId:Int, newItemName:String)
}

Dengan cara ini, Anda dapat merencanakan tampilan aplikasi tanpa perlu mengimplementasikan metode-metodenya.ping Anda membayangkan bagaimana berbagai metode akan terlihat. Ini mengikuti pola yang dikenal sebagai pemrograman untuk abs.traclebih berfokus pada hal-hal yang bersifat teoritis daripada implementasi sebenarnya.

Kelas yang diawali dengan abstract kata kunci dapat berisi abstract dan non-abstracmetode t. Namun, pewarisan berganda tidak didukung di abs.trackelas t, jadi Anda hanya bisa memperpanjang satu abstrackelas t.

Objek Tunggal

Singleton adalah kelas yang hanya diinstansiasi sekali dalam sebuah program. Konsep ini berasal dari pola pemrograman populer dan bermanfaat yang dikenal sebagai "pola singleton". Pola ini berguna untuk membuat instance yang dimaksudkan untuk berumur panjang dan sering diakses di seluruh program, di mana statusnya sangat penting untuk mengoordinasikan peristiwa dalam suatu sistem. Membuat kelas seperti itu di Scala mudah karena Scala menyediakan cara sederhana untuk membuat singleton menggunakan... object kata kunci.

object UserProfile {
    var userName = ""
    var isLoggedIn:Boolean = false
}

Anda kemudian dapat merujuk objek ini di seluruh program dengan jaminan bahwa semua bagian program melihat data yang sama karena hanya ada satu instance dari objek tersebut.

def getLoggedInStatus():Boolean = {
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean = {
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return UserProfile.isLoggedIn
}

Konsep anggota statis tidak ada di Scala, itulah sebabnya Anda menggunakan objek singleton yang bertindak seperti anggota statis dari sebuah kelas.

Kelas Implisit

Kelas implisit adalah fitur yang ditambahkan pada versi 2.10 dan digunakan terutama untuk menambahkan fungsionalitas baru ke kelas tertutup yang sudah ada.

The implicit Kata kunci harus didefinisikan dalam sebuah kelas, objek, atau trait. Konstruktor utama dari kelas implisit harus memiliki tepat satu argumen dalam daftar parameter pertamanya. Konstruktor tersebut juga dapat menyertakan daftar parameter implisit tambahan.

Pada contoh Scala di bawah ini, fungsionalitas baru untuk mengganti huruf vokal dalam sebuah String dengan * ditambahkan.

object StringUtil {
  implicit class StringEnhancer(str: String) {

    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

Anda perlu mengimpor kelas implisit di kelas tempat Anda menggunakannya.

import StringUtil.StringEnhancer

object ImplicitEx extends App {
  val msg = "This is Guru99!"
  println(msg.replaceVowelWithStar)
}

Pemrograman Berorientasi Objek (OOP) vs. Pemrograman Fungsional (FP)

Dalam OOP, program dibangun dengan mengelompokkanping Data dan fungsi-fungsi yang beroperasi pada data tersebut dikelompokkan menjadi unit-unit yang sangat terhubung. Objek membawa datanya dalam bidang-bidang dan metode-metode beroperasi padanya. Dalam gaya pemrograman ini, fungsi utama yang dibutuhkan adalah...tracIntinya adalah data, karena metode yang dibuat dimaksudkan untuk beroperasi pada data tersebut.

Pemrograman fungsionalSebaliknya, ia memisahkan data dan fungsi yang beroperasi padanya. Hal ini memungkinkan pengembang untuk memperlakukan fungsi sebagai hal yang absolut.traction dan kekuatan pendorong saat memodelkan program.

Scala memungkinkan pemrograman fungsional dengan memperlakukan fungsi sebagai warga negara kelas satu, memungkinkan fungsi tersebut untuk diteruskan sebagai nilai ke fungsi lain dan dikembalikan sebagai nilai juga. Kombinasi dari dua paradigma ini telah menjadikan Scala pilihan yang tepat untuk membangun perangkat lunak kompleks di industri seperti ilmu data.

Kerangka kerja penting pada Scala

Berikut beberapa framework penting untuk Scala:

  • Bermain adalah kerangka aplikasi web sumber terbuka yang menggunakan arsitektur MVCDirilis pada tahun 2007 dan sekarang dilisensikan di bawah Apache, framework ini menjadi salah satu framework paling populer di GitHub pada tahun 2013. Perusahaan seperti LinkedIn, WalmartSamsung dan Eero menggunakan kerangka kerja ini.
  • Mengangkat Lift adalah framework web gratis lainnya yang ditulis dalam Scala, diluncurkan pada tahun 2007. Foursquare menggunakan framework Lift. Ini adalah framework berkinerja tinggi yang cepat untuk dikembangkan.
  • Acre menyediakan perangkat bantu untuk membangun aplikasi berbasis pesan yang sangat konkuren, terdistribusi, dan tangguh di JVM.
  • Kucing - Leecork adalah perpustakaan yang menyediakan abstracPrinsip-prinsip pemrograman fungsional.
  • Spark adalah mesin analitik terpadu untuk pemrosesan data skala besar, yang banyak digunakan dalam alur kerja big data dan pembelajaran mesin.

Dukungan konkurensi

  • Nilai-nilai dalam Scala bersifat tetap (immutable) secara default, yang membuatnya sangat adaptif terhadap lingkungan konkurensi.
  • Scala memiliki banyak fitur yang membuatnya ideal untuk aplikasi konkuren.
  • Futures dan Promises mempermudah pemrosesan data secara asinkron, sehingga mendukung paralelisme.
  • Akka adalah sebuah toolkit yang menggunakan model konkurensi Actor. Aktor bertindak ketika mereka menerima pesan.
  • Konkurensi menggunakan thread dari Java juga didukung di Scala.
  • Pemrosesan aliran data adalah fitur hebat lainnya yang memungkinkan pemrosesan data secara terus-menerus dan waktu nyata.

Scala memiliki beberapa perpustakaan konkurensi terbaik di Java ekosistem:

  • Asli Java utas.
  • Fiber dari pustaka seperti Vertx.
  • ZIO, sebuah pustaka yang memiliki primitif untuk membantu menangani konkurensi dan komputasi asinkron.
  • Memori Transaksional Perangkat Lunak (STM) untuk transaksi.
  • Future, yang sudah terintegrasi dalam bahasa Scala.

Java vs.Skala

Inilah yang utama perbedaan antara Java dan Scala.

Scala Java
Lebih ringkas dan padat. Potongan kode yang relatif lebih besar.
Dirancang dan dikembangkan agar berorientasi objek dan fungsional. Mendukung berbagai fitur pemrograman fungsional seperti konkurensi dan immutabilitas. Awalnya dikembangkan sebagai bahasa berorientasi objek dan mulai mendukung fitur pemrograman fungsional dalam versi-versi terbaru. Namun, bahasa ini masih belum sekuat Scala untuk pemrograman fungsional.
Menggunakan model aktor untuk mendukung konkurensi. Menggunakan model berbasis thread konvensional untuk konkurensi.
Mendukung framework seperti Play dan Lift. Mendukung Spring, Grails, dan banyak lagi.
Mendukung evaluasi tunda (lazy evaluation). Tidak mendukung evaluasi tunda (lazy evaluation) secara bawaan.
Tidak ada anggota statis. Berisi anggota statis.
Mendukung kelebihan beban operator. Tidak mendukung kelebihan beban operator.
Proses kompilasi kode sumber relatif lambat. Kompilasi kode sumber lebih cepat daripada Scala.
Sifat-sifat bertindak seperti Java 8 antarmuka. Java 8 antarmuka mencoba menjembatani kesenjangan antara kelas dan antarmuka.
Penulisan ulang terkadang diperlukan saat melakukan peningkatan versi. Penulisan ulang umumnya tidak diperlukan antar versi.
Keamanan tipe memberikan keandalan kode yang kuat tetapi tidak ada jaminan bebas bug mutlak. Statis kuatping Membantu mengurangi banyak cacat saat runtime.
Memiliki beberapa keterbatasan kompatibilitas mundur di seluruh versi utama. Kompatibilitas mundur jangka panjang yang kuat.
OperaTor diperlakukan sebagai panggilan metode. OperaTor adalah sintaks khusus dan bukan panggilan metode.
Mendukung pewarisan berganda menggunakan trait. Tidak mendukung pewarisan berganda menggunakan kelas; menggunakan antarmuka sebagai gantinya.
Code ditulis dalam bentuk yang ringkas. Code ditulis dalam bentuk yang lebih panjang lebar.
Scala tidak mengandung kata kunci statis. Java berisi kata kunci statis.

Pertanyaan Umum Demo Slot

Scala memiliki kurva pembelajaran yang lebih curam daripada Java karena ia memadukan gaya berorientasi objek dan fungsional. Namun, pengembang dengan Java Orang yang berpengalaman biasanya cepat menguasai dasar-dasarnya. Berlatih dengan proyek-proyek kecil dan Scala REPL mempercepat pembelajaran.

Ya. Scala terus mendukung sistem skala besar di perusahaan yang menggunakan Akka, Sparkdan Kafka. Permintaan tetap kuat di bidang rekayasa data, teknologi keuangan, dan sistem terdistribusi di mana kinerja JVM dan pemrograman fungsional sangat berharga.

Ya. Asisten pengkodean AI modern memahami sintaks Scala, sistem tipe, dan kerangka kerja seperti Akka dan SparkMereka membantu menghasilkan template standar, menyarankan pola fungsional, menjelaskan kesalahan kompiler, dan melakukan refactoring kode, mempercepat pengembangan baik untuk pemula maupun ahli.

Scala menggerakkan Apache Spark, mesin terkemuka untuk pemrosesan data skala besar dalam pipeline AI. Pustaka seperti Breeze, Smile, dan Figaro mendukung komputasi numerik, pembelajaran mesin, dan pemodelan probabilistik, menjadikan Scala pilihan yang tepat untuk ilmu data produksi.

`val` menciptakan pengikatan yang tidak dapat diubah dan dievaluasi segera. `var` menciptakan pengikatan yang dapat diubah dan dapat ditetapkan ulang. `lazy val` menunda evaluasi hingga nilai tersebut pertama kali diakses, kemudian menyimpan hasilnya untuk pembacaan selanjutnya.

Ringkaslah postingan ini dengan: