Scala'yı Java Üzerinde Neden Kullanmalı?


16

Tamamen bir dil olarak Scala'dayım ... ve yine de herhangi bir şirketin neden Java'dan Scala'ya geçmesi gerektiğiyle mücadele ediyorum. Scala sadece JVM'nin üstündeki syntatik şeker mi yoksa Java üzerinden Scala'da gerçek dünya uygulamalarını geliştirecek temel gelişmeler var mı?


4
Bu var yinelenen bir yere sahip olmak.

2
Var ne - (Scala) o (iyi, benden fazla) çok kullandım gibi geliyor size kişisel deneyimlere bulundu?
SinirliWithFormsDesigner

Java geliştiricileri Scala hakkında ne düşünüyor, Java geliştiricisi olarak sırada ne yapmalıyım, Java'dan Scala'ya geçişimi nasıl başlatırım? Scala'yı gerçek dünya gelişimi için bir programlama dili olarak kullanmanın itici nedenlerine odaklanan bir cevap.
Dakotah North

1
@delnan, en azından SO: stackoverflow.com/questions/6073517/… . @DakotahKuzey, lütfen SE siteleri arasında gönderi yapmayın - sorunuza en uygun forumu seçin ve sadece orada yayınlayın. Diğer sitelerde, gönderiniz SO'da olduğu gibi yine de kapatılacaktır.
Péter Török

1
İşte mükemmel cevapları olan, SO'da neredeyse tamamen yinelenen bir kopya var: stackoverflow.com/questions/2683914/…
Péter Török

Yanıtlar:


19

Feragatname: Ben bir Scala gurusu değilim.

Scala, Java'nın (şu anda) yapmadığı iki şeyi son derece iyi yapıyor.

İşlevsel sorunları çözme

  • En temel düzeyde, Scala koleksiyon desteği ile tamamen kapanmıştır. Bu, artık (örneğin bir DZone direğinden utanmadan yırtık) kazan plakası kodu yazmak zorunda olmadığınız anlamına gelir

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

Bunun yerine şöyle bir şey yazın:

def bought(user: User) = items.filter(user bought _)
  • Daha işlevsel bir aşk var, ama şu anda hala işlevsel programlamayı emdiğim için bu konuda konuşmak için nitelikli değilim :)

Eşzamanlılığı daha güvenli bir şekilde çözün

  • Scala, Java'nın değişebilir verilerinden + doğal olarak daha güvenli olan bir aktör modeline (+ başka bir iyilik) sahiptir.

Dürüst olmak gerekirse, Scala'yı Java'nın üstünde ve omuzlarında durduracak çok fazla düşünemiyorum. Birçok küçük kazanç ve iyileştirme evet, ama aynı zamanda kendinizi asmak için çok daha fazla ip. YMMV

Biraz HTH


3
Akka'nın (aktör modeli) hem Scala hem de Java için kullanılabilir olduğunu belirtmek isterim. Bkz. Akka.io
Giorgio

5
Scala'yı seviyorum ve Java'dan göç ediyorum. Yine de Java ve Scala karşılaştırıldığında beni kızdırıyor ve Scala geliştiricileri mümkün olduğunca ayrıntılı ve çok satırlı Java kodunu yazmaya çalışıyor ve Scala bir astar ile değiştirmeyi çok çalışıyor. Java üzerinde okunabilirliği kaybı olmadan kod değil 12, 5 hatlarında sığabilir
mat

2
"Bir sürü küçük kazanç ve iyileştirme evet, ama aynı zamanda kendinizi asmak için çok daha fazla ip." +1
Rob

@lucek Özellikle pasaj, Java yerine C'nin kıvırcık parantez kuralını kullandığından: P
Andres F.

@robjb: "Pek çok küçük kazanç ve iyileştirme evet, ama aynı zamanda kendinizi asmak için çok daha fazla ip." Scala'nın kendini takman için sana daha fazla ip verdiğini kabul etmiyorum. En azından, cevapta bu ifade için bir açıklama yok ve kendimi göremiyorum. Ayrıca, Scala sadece bir OO dilinin üzerine birkaç işlevsel deyim getirmez (örneğin C # ve Java 8 gibi), OOP ve FP'yi bir paradigmaya entegre etmeye çalışır. IMHO bu "küçük gelişmeler" değil, bir paradigma anahtarı.
Giorgio

9

Bu "sadece sözdizimsel şeker" tanımınıza bağlıdır. Örneğin, Java, makine kodu üzerindeki sözdizimsel şekerden ne şekilde daha fazlasıdır?

Herhangi bir dil makine kodundan daha azını yapabilir , ancak hiçbir dil daha fazlasını yapamaz.

Üst düzey dillerin tabloya getirdiği şey, kodun daha kolay okunmasını ve anlaşılmasını, daha kolay oluşturulmasını ve daha fazla hata yakalanmasını sağlamaktır. Ve benim düşünceme göre, bunlardan ilki en önemli olanı - tam olarak "sadece sözdizimsel şeker".

Ancak sadece diğer ikisi göz önüne alındığında, Scala'nın Java'ya göre hala avantajları var.

Konuyu işaretlememek, ancak kapanışlara sahip olmak, kodun kapanıştan daha karmaşık olmasını sağlar. Java 7 kapatma adı verilen bir şey ekleyecek olsa da , bunlar olmayacak - sadece anonim işlevler olacaklar.

Daha fazla hata yakalamaya gelince, Scala'nın üstün varyans kullanımı, bunu yeterince kanıtlıyor. Dahası, değişmezliğe vurgu yapması da her türlü hatayı önler - Java'nın değişmez yapamaz, ancak bunu yapmak için kütüphaneyle birlikte gelmez.


4
Aslında Java'nın 'kapanışları' Java 8'e kadar gelmiyor
Martijn Verburg

1
@Martijn Düzeltme için teşekkürler. Bu noktada, aslında umrumda değil.
Daniel C. Sobral

1
Sözdizimsel şekerin mevcut anlambilimin üstünde alternatif bir sözdizimi olduğunu söyleyebilirim. Makine kodunun semantiği nesneler, sınıflar vb. İçermediğinden, Java'nın sadece makine kodu üzerinde sözdizimsel şeker olmadığını düşünüyorum . Anlambilim ve programlama paradigması farklıdır.
Giorgio

@Martijn Verburg: Java'nın halihazırda bir tür kapatma şekli vardır (anonim iç sınıflar şeklinde). Eksik olan anonim işlevlerdir (tam olarak bir yöntem ve bazı özel sözdizimi ile özel anonim sınıflar olarak düşünülebilir).
Giorgio

@Giorgio - doğru, ancak anon iç sınıfı yaklaşan invüinamik tabanlı uygulamaya kıyasla zayıf performans gösteriyor ve iyi, kaynak kodu çirkin IMO :-)
Martijn Verburg

2

Martijn'ın cevabının üstüne, Scala'nın Java'dan daha etkileyici olduğunu ve faydalarının (1) sizi daha üretken hale getirdiğini (2) aynı sorunu çözmek için daha az kod yazmak anlamına gelir. kodu (IMHO hatasız kod bir efsanedir).


0

Yaklaşık 3 aydır Scala kullanıyorum ve hala Java'da yapamayacağım bir şey bulamıyorum. Benim için tam anlamıyla Scala her literatür aynı şey söz görünüyor klişe . Eğer aradığınız şey kazan plakasını azaltmaksa, o zaman Scala sizin için ama IMHO'dur, örneğin yukarıda verilen filtre örneği apache koleksiyonları kullanılarak da çözülebilir

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

veya bunun gibi kapaklar kullanın

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

Ama elbette daha ayrıntılı. Yine de tür çıkarım seviyorum. Scala'yı öğrendikçe, bunun muhtemelen her şeyin altında olduğunu fark edeceksiniz. Bence her dil + ve ve -ve ile geliyor.


-3

anlama için listeler.

örneğin java'da şunu yazıyorsunuz:

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

Scala'da aynı kod, çok daha zarif bir şekilde yazılmıştır (Python gibi):

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

ve bitti.

Scala'nın Java'nın sunmadığı çok şey var. Hiç bir karşılaştırma yok. Tek sorun, insanların Java'ya daha fazla aşina olmaları (CS derslerinde öğrettikleri b / c) ve henüz Scala paradigması konusunda yetenekli değil.

Scala kuyruk özyineleme vardır, tuples dönebilir (sanırım Java 8 geliyor olabilir bir şey).

Karşılaştırma yok. Scala, Java Generics'in çekirdek ekibinde çalışan Martin Ordersky tarafından geliştirildi.

Scala çok daha üstün bir dildir. Hepsi bu kadar. Aksini söyleyen insanlar Scala'yı daha iyi bilecek kadar araştırmamışlardır.

Yukarıda, kuyruk özyineleme optimizasyonu (JVM'nin Scala'nın derleyicisinin yapabileceği şekilde yapamayacağı) söylemek istedim.

Scala ayrıca JVM uygulamalarından daha hızlı derler ve çalışır (Evet, bu doğru). Çerçevelerden bahsetmiyorum bile. Örneğin Tomcat'i kullanıyoruz ve REST'i işlemek için bazı serveletler dağıtıyoruz.

Tomcat'in yapamayacağı şeylerden biri, engellemeyen G / Ç gerektiren asenkron işlemlerdir. Bunun için, JAVA geliştiricileri genellikle bir mesaj kuyruğu kullanarak bir geçici çözüm icat etmişlerdir (mesajı kuyruğa gönderin ve başka bir işlem veya iş parçacığı bunu alır ve arka planda ne istersen yapar).

Ne yazık ki, bu yöntem cr * p ve Tomcat'te Java sunucu uygulamalarını dağıtmanın sınırlamalarına yönelik bir hack'tir.

Git akka + spreyi kontrol et. Scala'nın Aktörlerini kullanır (Aktörler tıpkı Threads gibidir, ancak iletişim kurabilmelerinin tek yolu mesajlardır).

Ve bitti, asenkron REST çağrıları kolaylaştırıldı. Uzun süren arka plan görevi? Sorun değil. Sadece ateş edin ve unutun ve her seferinde ön uçtan durumunu kontrol etmek için biraz REST yoklaması yapın.

Hala Java kullanıyorsanız ve scala'dan daha iyi olduğunu düşünüyorsanız, bilgisayarınızı yazmak için kullanmayı bırakabilir ve tüy kalem günlerine ve mum ışığında yazmaya geri dönebilirsiniz. Java, Scala ile karşılaştırıldığında temel olarak antediluvian.


4
Bu bir liste kavrayışı örneği değildir. Ve Java'da şunu yazıyorsunuz:int myVar = condition ? someValue : otherValue
kevin cline

1
Bu //some value //other valueyorumları /*some value*/stil veya benzeri bir şeye göre düzenlemelisiniz. Şu anda sözdizimi vurgulama
berbat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.