Mengapa Menggunakan Scala di Jawa

16

Saya benar-benar menyukai Scala sebagai bahasa ... dan saya masih bergumul dengan mengapa perusahaan mana pun harus beralih dari Jawa ke Scala. Apakah Scala hanya gula sintaksis di atas JVM atau apakah ada perbaikan mendasar dalam Scala di Jawa yang akan meningkatkan aplikasi dunia nyata?

Dakotah Utara
sumber
4
Ini harus memiliki duplikat di suatu tempat.
2
Kedengarannya seperti Anda sering menggunakannya (Scala) (yah, lebih dari saya) - apa yang Anda temukan dalam pengalaman pribadi Anda?
FrustratedWithFormsDesigner
Saya telah melihat pertanyaan seperti ... Apa pendapat pengembang Java tentang Scala, Apa yang harus saya lakukan selanjutnya sebagai pengembang Java, Bagaimana cara memulai migrasi saya dari Jawa ke Scala ... tetapi tidak ada tempat saya melihat pertanyaan atau jawaban yang berfokus pada alasan mengemudi untuk menggunakan Scala sebagai bahasa pemrograman untuk pengembangan dunia nyata.
Dakotah Utara
1
@delnan, setidaknya pada SO: stackoverflow.com/questions/6073517/… . @DakotahNorth, tolong jangan posting lintas antara situs SE - pilih forum yang paling cocok untuk pertanyaan Anda dan posting hanya di sana. Di situs lain, postingan Anda akan ditutup, sama seperti yang terjadi pada yang di SO.
Péter Török
1
Ini adalah duplikat lain yang hampir persis sama pada SO, dengan jawaban luar biasa: stackoverflow.com/questions/2683914/…
Péter Török

Jawaban:

19

Penafian: Saya bukan guru Scala.

Scala melakukan dua hal dengan sangat baik yang Java (saat ini) tidak.

Selesaikan masalah fungsional

  • Pada tingkat paling dasar, Scala memiliki penutupan penuh dengan dukungan koleksi. Ini berarti Anda tidak lagi harus menulis kode pelat ketel seperti (tanpa malu merobek pos DZone)

    public List<Item> bought(User user)
    {
        List<Item> result = new ArrayList();
        for (Item item : currentItems)
        {
            if (user.bought(item))
            {
                result.add(item);
            }
        }
        return result;
    }

Tetapi sebaliknya tuliskan sesuatu seperti:

def bought(user: User) = items.filter(user bought _)
  • Ada lebih banyak cinta fungsional, tapi saya tidak memenuhi syarat untuk membicarakannya karena saya saat ini masih payah pada pemrograman fungsional :)

Selesaikan konkurensi dengan cara yang lebih aman

  • Scala memiliki model aktor (+ beberapa kebaikan lainnya) yang secara inheren lebih aman daripada data Java yang dapat diubah + mengunci model Thread (tidak peduli seberapa bagus lib yang didapat, Java masih terhambat oleh bahasa).

Jujur saya tidak bisa memikirkan terlalu banyak hal lain yang membuat Scala berdiri tegak di atas Jawa. Banyak keuntungan dan perbaikan kecil ya, tetapi juga jauh lebih banyak tali untuk digantung. YMMV

HTH sedikit

Martijn Verburg
sumber
3
Saya ingin menunjukkan bahwa akka (model aktor) tersedia untuk Scala dan Java. Lihat akka.io
Giorgio
5
Saya suka Scala dan saya bermigrasi ke sana dari Jawa. Masih membuatku kesal ketika Java dan Scala dibandingkan dan pengembang Scala mencoba untuk menulis sebagai kode Java multi-verbose dan multi-baris mungkin dan berusaha sangat keras untuk menggantinya dengan Scala one liner. Tanpa kehilangan keterbacaan di atas kode Java bisa muat dalam 5 baris, bukan 12
matt
2
"Banyak keuntungan dan perbaikan kecil ya, tetapi juga jauh lebih banyak tali untuk digantung." +1
Rob
@ lucek Terutama karena cuplikan menggunakan konvensi kurung kurawal C alih-alih Java: P
Andres F.
@robjb: "Banyak keuntungan kecil dan peningkatan ya, tetapi juga jauh lebih banyak tali untuk digantung." Saya tidak setuju bahwa Scala memberi Anda lebih banyak tali untuk digantung. Paling tidak, tidak ada penjelasan untuk pernyataan ini dalam jawabannya dan saya tidak bisa melihatnya sendiri. Juga, Scala tidak hanya memperkenalkan beberapa idiom fungsional di atas bahasa OO (seperti misalnya C # dan Java 8), ia mencoba untuk mengintegrasikan OOP dan FP ke dalam satu paradigma. IMHO ini bukan "perbaikan kecil" melainkan saklar paradigma.
Giorgio
9

Itu tergantung pada definisi Anda tentang "gula sintaksis saja". Misalnya, dalam hal apa Java lebih dari sekadar gula sintaksis di atas kode mesin?

Bahasa apa pun dapat melakukan kurang dari kode mesin, tetapi tidak ada bahasa yang bisa berbuat lebih banyak.

Apa yang dibawa bahasa tingkat tinggi ke meja adalah membuat kode lebih mudah dibaca dan dipahami, lebih mudah untuk menulis, dan menangkap lebih banyak kesalahan. Dan, menurut pendapat saya, ini adalah yang pertama yang paling membuat perbedaan - tepatnya "gula sintaksis".

Namun mengingat hanya dua lainnya, masih ada kelebihan Scala atas Jawa.

Bukan untuk memperjelas titik, tetapi memiliki penutupan membuat kode jauh lebih mudah dikompilasi daripada tidak memiliki penutupan. Dan sementara Java 7 akan menambahkan sesuatu yang disebut closures, mereka tidak akan seperti itu - mereka hanya akan menjadi fungsi anonim.

Adapun untuk menangkap lebih banyak kesalahan, penanganan varian unggul Scala adalah bukti yang cukup. Lebih jauh lagi, penekanannya pada imutabilitas juga mencegah segala macam kesalahan - ini bukan berarti Java tidak bisa melakukan kekekalan, tetapi itu tidak datang dengan perpustakaan untuk melakukannya.

Daniel C. Sobral
sumber
4
Sebenarnya 'penutupan' Jawa tidak datang sampai Jawa 8
Martijn Verburg
1
@ Martijn Terima kasih atas koreksinya. Pada titik ini, saya sebenarnya tidak peduli lagi.
Daniel C. Sobral
1
Saya akan mengatakan bahwa gula sintaksis hanyalah sintaksis alternatif di atas semantik yang ada. Karena semantik kode mesin tidak termasuk objek, kelas, dll, saya pikir Java tidak hanya gula sintaksis atas kode mesin. Paradigma semantik dan pemrogramannya berbeda.
Giorgio
@ Martijn Verburg: Java sudah memiliki bentuk penutupan (dalam bentuk kelas batin anonim). Apa yang kurang adalah fungsi anonim (yang dapat dianggap sebagai kelas anonim khusus dengan tepat satu metode dan beberapa sintaks khusus).
Giorgio
@Giorgio - benar, tetapi kelas dalam anon berkinerja buruk dibandingkan dengan implementasi berbasis invokedynamic yang akan datang dan itu baik, kode sumber jelek IMO :-)
Martijn Verburg
2

Di atas jawaban Martijn saya ingin menambahkan bahwa Scala lebih ekspresif daripada Java dan manfaatnya adalah (1) membuat Anda lebih produktif (2) menulis lebih sedikit kode untuk menyelesaikan masalah yang sama berarti Anda dapat mengurangi bug di komputer Anda. kode (kode bebas bug IMHO adalah mitos).

sakisk
sumber
0

Saya telah menggunakan Scala selama sekitar 3 bulan sekarang dan masih tidak dapat menemukan apa pun yang tidak dapat saya lakukan di Jawa. Bagi saya secara harfiah setiap literatur tentang Scala tampaknya menyebutkan hal yang sama boilerplate . Jika apa yang Anda cari adalah mengurangi boilerplate maka Scala adalah untuk Anda tetapi IMHO, misalnya contoh filter yang diberikan di atas bisa diselesaikan dengan menggunakan koleksi apache

<T> CollectionUtils.filter(Predicate<T>...)

atau gunakan penutupan seperti itu

<T> CollectionUtils.forAllDo(..., Closure<T>)

Tapi tentu saja lebih bertele-tele. Saya suka inferensi jenis. Ketika Anda mempelajari Scala, Anda akan menyadari bahwa ini mungkin adalah apa yang sedang terjadi. Menurut pendapat saya, setiap bahasa dilengkapi dengan + ve dan -ve.

pengguna105463
sumber
-3

daftar pemahaman, untuk pemahaman.

misalnya di java Anda menulis:

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

Dalam scala, kode yang sama, jauh lebih elegan ditulis (Seperti python) seperti:

int myVar = (//some value) if (condition) else // other value;

dan dilakukan.

Ada begitu banyak yang ditawarkan Scala yang tidak dimiliki Java. Tidak ada perbandingan sama sekali. Satu-satunya masalah adalah orang lebih akrab dengan Java (b / c itulah yang mereka ajarkan di kelas CS) dan belum begitu terampil dengan paradigma Scala.

Scala memiliki rekursi ekor, ia dapat mengembalikan tupel (sesuatu yang mungkin datang di Jawa 8 saya pikir).

Tidak ada perbandingan. Scala dikembangkan oleh Martin Ordersky, yang bekerja pada tim inti untuk Java Generics.

Scala hanyalah bahasa yang jauh lebih unggul. Itu semua yang ada untuk itu. Orang yang mengatakan sebaliknya hanya belum cukup menjelajahi Scala untuk tahu lebih baik.

Di atas, saya bermaksud mengatakan optimisasi rekursi ekor (yang JVM tidak dapat lakukan dengan cara yang dapat dilakukan oleh kompilator Scala).

Scala juga mengkompilasi dan menjalankan lebih cepat dari aplikasi JVM (Ya, itu benar). Belum lagi kerangka kerjanya. Kami menggunakan Tomcat misalnya dan menggunakan beberapa servelet untuk menangani REST.

Satu hal yang tidak dapat dilakukan Tomcat, adalah operasi asinkron yang memerlukan I / O yang tidak terblokir. Untuk ini, pengembang JAVA biasanya menemukan solusi menggunakan antrian pesan (mengirim pesan ke antrian, dan beberapa proses atau utas mengambilnya dan melakukan apa pun yang Anda inginkan di latar belakang).

Sayangnya, metode ini adalah cr * p, dan peretasan atas batasan penggunaan servlets Java di Tomcat.

Periksa akka + spray. Ia menggunakan scala's Actors (Aktor seperti Threads, kecuali satu-satunya cara mereka dapat berkomunikasi adalah melalui pesan).

Dan selesai, panggilan REST asinkron menjadi mudah. Tugas latar belakang yang sudah berjalan lama? Tidak masalah. Langsung saja dan lupakan, dan lakukan beberapa polling REST untuk memeriksa statusnya dari front-end sesekali.

Jika Anda masih menggunakan Java dan berpikir itu lebih baik daripada scala, Anda sebaiknya berhenti menggunakan komputer untuk mengetik dan kembali ke masa pena bulu domba dan menulis dengan cahaya lilin. Java pada dasarnya adalah kuno dibandingkan dengan Scala.

Vic
sumber
4
Ini bukan contoh dari pemahaman daftar. Dan di Jawa Anda menulis:int myVar = condition ? someValue : otherValue
kevin cline
1
Anda harus mengedit //some value //other valuekomentar itu untuk yang /*some value*/bergaya atau sesuatu. Saat ini mengacaukan penyorotan sintaksis Anda: p
KChaloux