Saya memerlukan beberapa contoh kode (dan saya juga sangat ingin tahu tentang mereka) dari kode Scala dan Java yang menunjukkan bahwa kode Scala lebih sederhana dan ringkas daripada kode yang ditulis di Java (tentu saja kedua contoh harus menyelesaikan masalah yang sama).
Jika hanya ada sampel Scala dengan komentar seperti "ini adalah pabrik abstrak di Scala, di Java akan terlihat jauh lebih rumit" maka ini juga dapat diterima.
Terima kasih!
Saya suka hampir semua diterima dan jawaban ini
Jawaban:
Mari perbaiki contoh stacker dan gunakan kelas kasus Scala :
Kelas Scala di atas berisi semua fitur dari kelas Java di bawah, dan beberapa lagi - misalnya mendukung pencocokan pola (yang tidak dimiliki Java). Scala 2.8 menambahkan argumen bernama dan default, yang digunakan untuk menghasilkan metode salin untuk kelas kasus, yang memberikan kemampuan yang sama seperti metode with * dari kelas Java berikut.
Kemudian, dalam penggunaan kami memiliki (tentu saja):
Melawan
sumber
productElements
danunapply
, bukan di konstruktor, bidang, atau pengaksescase class Person(val firstName: String, val lastName: String)
Jadi apa? Menjadikan hal itu pribadi juga mungkin, tetapi tidak masuk akal, karena tidak berlaku, dll.case class Person(private val firstName: String)
, tetapi Anda seharusnya tidak menggunakan kelas kasus. Sebaliknya lakukanclass Person(firstName: String)
danfirstName
bersifat pribadi secara default.val
danprivate val
adalah apakah metode pengakses , yaitufirstName()
danfirstName(String)
, bersifat publik atau privat. Di bidang Scala selalu bersifat pribadi. Agar Scala menghasilkan metode get / set gaya Java (selain pengakses gaya Scala), ada@BeanProperty
anotasi.Saya menemukan yang ini mengesankan
Jawa
Scala
Serta yang ini (maaf karena tidak menempel, saya tidak ingin mencuri kodenya)
sumber
getFirstName
dangetLastName
metode. Anda harus membuat anotasi parameter denganscala.reflect.BeanProperty
anotasi untuk melakukannya.get
. Kode Java idiomatik berbeda dari kode Scala idiomatik. Terkadangis
awalan digunakan untuk boolean. davetron5000.github.com/scala-style/naming_conventions/methods/…case class
dan mendapatkantoString
,equals
danhashCode
gratis (dan Anda juga tidak perlu membuat argumenval
secara eksplisit):case class Person(firstName: String, lastName: String)
case class
, bukan hanya untukclass
.Tugas: Menulis program untuk mengindeks daftar kata kunci (seperti buku).
Penjelasan:
Jawa:
Scala:
sumber
Tugas:
Anda memiliki daftar
people
objek kelasPerson
yang memiliki bidangname
danage
. Tugas Anda adalah mengurutkan daftar ini terlebih dahuluname
, lalu menurutage
.Jawa 7:
Scala:
Memperbarui
Sejak saya menulis jawaban ini, ada kemajuan yang cukup pesat. Lambda (dan referensi metode) akhirnya mendarat di Jawa, dan mereka menggemparkan dunia Jawa.
Seperti inilah kode di atas akan terlihat dengan Java 8 (disumbangkan oleh @fredoverflow):
Meskipun kode ini hampir sama pendeknya, kode ini tidak berfungsi dengan elegan seperti kode Scala.
Dalam larutan Scala, yang
Seq[A]#sortBy
metode menerima fungsiA => B
di manaB
diperlukan untuk memiliki sebuahOrdering
.Ordering
adalah kelas tipe. Pikirkan yang terbaik dari kedua dunia: SepertiComparable
, ini tersirat untuk jenis yang dimaksud, tetapi sepertiComparator
, ini dapat diperluas dan dapat ditambahkan secara retrospektif ke jenis yang tidak memilikinya. Karena Java tidak memiliki kelas tipe, ia harus menduplikasi setiap metode tersebut, sekali untukComparable
, lalu untukComparator
. Misalnya, lihatcomparing
dan dithenComparing
sini .Kelas-tipe memungkinkan seseorang untuk menulis aturan seperti "Jika A memiliki pengurutan dan B memiliki pengurutan, maka tupelnya (A, B) juga memiliki pengurutan". Dalam kode, yaitu:
Begitulah cara
sortBy
dalam kode kita dapat dibandingkan berdasarkan nama dan kemudian berdasarkan usia. Semantik tersebut akan dikodekan dengan "aturan" di atas. Seorang programmer Scala secara intuitif akan mengharapkan ini bekerja dengan cara ini. Tidak ada metode tujuan khusus seperti yangcomparing
harus ditambahkanOrdering
.Lambda dan referensi metode hanyalah puncak gunung es yang merupakan pemrograman fungsional. :)
sumber
Tugas:
Anda punya file XML "company.xml" yang terlihat seperti ini:
Anda harus membaca file ini dan mencetak bidang
firstName
danlastName
dari semua karyawan.Jawa: [diambil dari sini ]
Scala: [diambil dari sini , slide # 19]
[EDIT oleh Bill; Periksa komentar untuk diskusi] -
Hmm, bagaimana melakukannya tanpa membalas di bagian balasan yang tidak diformat ... Hmph. Saya kira saya akan mengedit jawaban Anda dan membiarkan Anda menghapusnya jika itu mengganggu Anda.
Beginilah cara saya melakukannya di Java dengan perpustakaan yang lebih baik:
Ini hanyalah peretasan cepat yang tidak melibatkan sihir dan semua komponen yang dapat digunakan kembali. Jika saya ingin menambahkan beberapa keajaiban saya bisa melakukan sesuatu yang lebih baik daripada mengembalikan array array string, tetapi bahkan seperti ini GoodXMLLib akan sepenuhnya dapat digunakan kembali. Parameter pertama dari scanFor adalah bagian, semua parameter yang akan datang adalah item yang akan ditemukan yang terbatas, tetapi antarmuka dapat digosok sedikit untuk menambahkan beberapa tingkat pencocokan tanpa masalah nyata.
Saya akan mengakui bahwa Java memiliki beberapa dukungan perpustakaan yang cukup buruk secara umum, tetapi ayolah - untuk membandingkan penggunaan yang mengerikan dari perpustakaan XML lama (?) Java dekade untuk implementasi yang dilakukan berdasarkan singkat tidak adil - dan jauh dari perbandingan bahasa!
sumber
Peta tindakan yang harus dilakukan bergantung pada string.
Jawa 7:
Scala:
Dan itu semua dilakukan dengan rasa terbaik!
Jawa 8:
sumber
todos.get("hi")
kembaliOption[()=>Unit]
yang diperlukan untuk mencocokkan dengan benar.val defaultFun = {() => println("task not found")}; todos.getOrElse("hi", defaultFun).apply()
val todos = Map("hi" -> { () => println("Good morning!") }) withDefaultValue { () => println("task not found") }
dan kemudiantodos("hi")()
Saya sedang menulis game Blackjack di Scala sekarang. Berikut adalah tampilan metode dealerWins saya di Java:
Berikut tampilannya di Scala:
Hore untuk fungsi tingkat tinggi!
Solusi Java 8:
sumber
def dealerWins = !(players exists (_ beats dealer))
Saya menyukai contoh sederhana dari penyortiran dan transformasi ini, yang diambil dari buku 'Scala Awal' David Pollak:
Di Scala:
Di Jawa:
sumber
Bagaimana dengan Quicksort?
Jawa
Berikut adalah contoh java yang ditemukan melalui pencarian google,
URL-nya adalah http://www.mycstutorials.com/articles/sorting/quicksort
Scala
Upaya cepat pada versi Scala. Musim terbuka untuk pemodifikasi kode; @)
sumber
partition
untuk menghindari itu.Saya sangat menyukai jawaban pengguna yang tidak diketahui sehingga saya akan mencoba memperbaikinya. Kode di bawah ini bukan terjemahan langsung dari contoh Java, tetapi menyelesaikan tugas yang sama dengan API yang sama.
sumber
Saya sangat menyukai metode getOrElseUpdate, ditemukan di mutableMap dan ditampilkan di sini, Java pertama, tanpa:
ya - WordCount, dan di sini dalam skala:
Dan ini dia di Java 8:
Dan jika Anda ingin 100% berfungsi:
filter
dansort
telah ditampilkan, tapi lihat betapa mudahnya mereka diintegrasikan dengan peta:sumber
Ini adalah contoh yang sangat sederhana: Bilangan bulat persegi dan kemudian tambahkan
Dalam skala:
Peta ringkas menerapkan fungsi ke semua elemen larik, jadi:
Lipat kiri akan dimulai dengan 0 sebagai akumulator dan berlaku
add(s,i)
untuk semua elemen (i) dari array, sehingga:Sekarang ini dapat lebih dipadatkan menjadi:
Yang ini saya tidak akan mencoba di Java (untuk banyak pekerjaan), ubah XML menjadi Peta:
Satu liner lain untuk mendapatkan peta dari XML:
sumber
sumSquare
Scala Anda adalah bahwa itu terlihat sangat samar bagi pengembang Java, yang akan memberi mereka amunisi terhadap Anda untuk mengeluh bahwa Scala tidak jelas dan rumit ...Masalah: Anda perlu merancang metode yang akan mengeksekusi kode apa pun secara asinkron.
Solusi di Jawa :
Hal yang sama di Scala (menggunakan aktor):
sumber
Pola Pemutus Sirkuit dari Michael Nygard's Release It di FaKods ( tautan ke kode )
implementasi terlihat seperti ini di Scala:
Yang menurut saya sangat bagus. Ini terlihat hanya sebagai bagian dari bahasa tetapi ini adalah campuran sederhana di Object CircuitBreaker yang melakukan semua pekerjaan.
Referensi dalam bahasa lain Google untuk "Pemutus arus" + bahasa Anda.
sumber
Saya sedang menyiapkan dokumen yang memberikan beberapa contoh kode Java dan Scala, hanya memanfaatkan fitur Scala yang mudah dipahami:
Scala: Java yang lebih baik
Jika Anda ingin saya menambahkan sesuatu, silakan balas di komentar.
sumber
Mengapa tidak ada yang memposting ini sebelumnya:
Jawa:
116 karakter.
Scala:
56 karakter.
sumber
Application
sifat yang dianggap berbahaya ... scala-blogs.org/2008/07/…Aliran tak terbatas yang dievaluasi dengan malas adalah contoh yang baik:
Berikut adalah pertanyaan untuk mengatasi aliran tak terbatas di Java: Apakah desain iterator tak terbatas buruk?
Contoh bagus lainnya adalah fungsi dan closure kelas satu:
Java tidak mendukung fungsi kelas satu, dan meniru closure dengan kelas dalam anonim tidak terlalu elegan. Hal lain yang ditunjukkan contoh ini yang tidak dapat dilakukan java adalah menjalankan kode dari interpreter / REPL. Saya merasa ini sangat berguna untuk menguji cuplikan kode dengan cepat.
sumber
Iterable
danIterator
menghasilkan aliran tak terbatas.Kode Scala ini ...
... akan benar-benar tidak terbaca di Java, jika memungkinkan.
sumber