Dlaczego warto używać Scali przez Javę

16

Jestem całkowicie językiem Scala jako językiem ... i wciąż mam problem z tym, dlaczego każda firma powinna przejść z Javy na Scalę. Czy Scala jest tylko cukrem syntaktycznym na JVM, czy też istnieją fundamentalne ulepszenia Scali w stosunku do Javy, które poprawiłyby aplikacje w świecie rzeczywistym?

Dakotah North
źródło
4
Ten dostał mieć duplikat gdzieś.
2
Wygląda na to, że używałem (Scala) dużo (dobrze, więcej niż ja) - Co ty znaleźć w swoich osobistych doświadczeń?
FrustratedWithFormsDesigner
Widziałem pytania takie jak ... Co deweloperzy Java myślą o Scali, Co powinienem zrobić jako programista Java, Jak rozpocząć migrację z Java do Scali ... ale nie wiem, gdzie widziałem pytanie lub odpowiedź, która koncentruje się na głównych przyczynach używania Scali jako języka programowania do rozwoju w świecie rzeczywistym.
Dakotah North
1
@ delnan, przynajmniej na SO: stackoverflow.com/questions/6073517/… . @DototahNorth, nie przechodź między postami na stronach SE - wybierz forum najlepiej dostosowane do twojego pytania i publikuj tylko tam. W innych witrynach i tak Twój post zostanie zamknięty, tak jak to miało miejsce w przypadku SO.
Péter Török,
1
Oto kolejny, prawie dokładny duplikat na SO, z doskonałymi odpowiedziami: stackoverflow.com/questions/2683914/…
Péter Török

Odpowiedzi:

19

Oświadczenie: Nie jestem guru Scala.

Scala robi dwie rzeczy wyjątkowo dobrze, czego nie robi Java (obecnie).

Rozwiąż problemy funkcjonalne

  • Na najbardziej podstawowym poziomie Scala ma w pełni rozwinięte zamknięcia z obsługą kolekcji. Oznacza to, że nie musisz już pisać kodu płyty kotła, takiego jak (bezwstydnie zerwany post 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;
    }

Zamiast tego napisz coś takiego:

def bought(user: User) = items.filter(user bought _)
  • Jest więcej funkcjonalnej miłości, ale nie jestem uprawniony do mówienia o tym, ponieważ obecnie jestem do bani programowania funkcjonalnego :)

Rozwiązuj współbieżność w bezpieczniejszy sposób

  • Scala ma model aktorów (+ trochę innej dobroci), który jest dziedzicznie bezpieczniejszy niż zmienne dane Javy + blokuje model wątku (bez względu na to, jak dobre są biblioteki, Java nadal jest utrudniona przez język).

Nie mogę szczerze myśleć o zbyt wielu innych rzeczach, które sprawiają, że Scala stoi na głowie ponad Javą. Tak, wiele drobnych korzyści i ulepszeń, ale także znacznie więcej lin do zawieszenia. YMMV

HTH trochę

Martijn Verburg
źródło
3
Chciałbym zaznaczyć, że akka (model aktora) jest dostępny zarówno dla Scali, jak i Javy. Zobacz akka.io
Giorgio
5
Lubię Scalę i migruję do niej z Javy. Wciąż mnie to wkurza, gdy Java i Scala są porównywane, a programiści Scali próbują napisać możliwie pełny i wielowierszowy kod Java i bardzo ciężko próbują go zastąpić liniowym Scala. Bez utraty czytelności powyżej kodu Java może zmieścić się w 5 wierszach, a nie 12
mat
2
„Tak, wiele małych korzyści i ulepszeń, ale także znacznie więcej lin, z którymi można się powiesić”. +1
Rob
@lucek Zwłaszcza, że ​​snippet używa konwencji nawiasów klamrowych C zamiast Javy: P
Andres F.
@robjb: „Wiele małych korzyści i ulepszeń tak, ale także znacznie więcej lin, na których można się powiesić”. Nie zgadzam się z tym, że Scala daje ci więcej liny do powieszenia się. Przynajmniej nie ma wyjaśnienia dla tego stwierdzenia w odpowiedzi i sam go nie widzę. Ponadto Scala nie tylko wprowadza kilka funkcjonalnych idiomów na język OO (np. C # i Java 8), ale próbuje zintegrować OOP i FP w jednym paradygmacie. IMHO nie jest to „małe ulepszenie”, ale raczej zmiana paradygmatu.
Giorgio
9

To zależy od twojej definicji „po prostu cukru syntaktycznego”. Na przykład, w jaki sposób Java jest czymś więcej niż tylko cukrem syntaktycznym nad kodem maszynowym?

Każdy język może zrobić mniej niż kod maszynowy, ale żaden język nie może zrobić więcej.

Języki wysokiego poziomu wprowadzane do tabeli ułatwiają czytanie i zrozumienie kodu, łatwiejsze komponowanie i wykrywanie większej liczby błędów. I, moim zdaniem, jest to pierwszy z nich, który robi największą różnicę - właśnie „tylko cukier syntaktyczny”.

Ale biorąc pod uwagę tylko dwa pozostałe, Scala ma jeszcze przewagę nad Javą.

Nie wspominając o tym, ale posiadanie zamknięć sprawia, że ​​kod jest znacznie łatwiejszy do skomponowania niż brak zamknięć. I chociaż Java 7 doda coś, co nazywa się zamknięciami, to nie będzie to - będą tylko anonimowymi funkcjami.

Jeśli chodzi o wychwytywanie większej liczby błędów, doskonała obsługa wariancji przez Scalę jest wystarczającym dowodem. Co więcej, jego nacisk na niezmienność również zapobiega wszelkiego rodzaju błędom - nie jest tak, że Java nie może zrobić niezmiennego, ale po prostu nie ma biblioteki.

Daniel C. Sobral
źródło
4
W rzeczywistości „zamknięcia” Javy pojawią się dopiero po Javie 8
Martijn Verburg
1
@Martijn Dzięki za korektę. W tej chwili już mnie to nie obchodzi.
Daniel C. Sobral
1
Powiedziałbym, że cukier syntaktyczny jest po prostu alternatywną składnią nad istniejącą semantyką. Ponieważ semantyka kodu maszynowego nie obejmuje obiektów, klas itp., Myślę, że Java to nie tylko cukier syntaktyczny nad kodem maszynowym. Semantyka i paradygmat programowania są różne.
Giorgio
@Martijn Verburg: Java ma już formę zamknięć (w formie anonimowych klas wewnętrznych). Brakuje w nim funkcji anonimowych (które można traktować jako specjalne anonimowe klasy z dokładnie jedną metodą i specjalną składnią).
Giorgio
@Giorgio - prawda, ale wewnętrzna klasa anonowa ma słabą wydajność w porównaniu z nadchodzącą implementacją opartą na wywoływaniu dynamicznym i dobrze, kod źródłowy jest brzydki IMO :-)
Martijn Verburg
2

Oprócz odpowiedzi Martijna chciałbym dodać, że Scala jest bardziej ekspresyjna niż Java, a korzyści są takie, że (1) sprawia, że ​​jesteś bardziej produktywny (2) pisząc mniej kodu do rozwiązania tego samego problemu, oznacza to, że możesz zmniejszyć liczbę błędów w swoim kod (bezbłędny kod IMHO to mit).

sakisk
źródło
0

Używam Scali od około 3 miesięcy i nadal nie mogę znaleźć niczego, czego nie byłbym w stanie zrobić w Javie. Dla mnie dosłownie każda literatura Scala wydaje wspomnieć samo boilerplate . Jeśli to, czego szukasz, to zmniejszenie płyty kotłowej, to Scala jest dla Ciebie, ale IMHO, na przykład powyższy przykład filtra można równie dobrze rozwiązać za pomocą kolekcji Apache

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

lub użyj takich zamknięć

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

Ale oczywiście więcej gadatliwy. Podoba mi się jednak wnioskowanie typu. Kiedy uczysz się Scali, zdajesz sobie sprawę, że to prawdopodobnie dzieje się pod maską. Moim zdaniem każdy język ma + ve i -ve.

użytkownik105463
źródło
-3

zrozumienie listy, do zrozumienia.

na przykład w java piszesz:

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

W scala ten sam kod jest napisany o wiele bardziej elegancko (jak python) jak:

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

i zrobione.

Scala oferuje tyle możliwości, że Java nie. Po prostu w ogóle nie ma porównania. Jedynym problemem jest to, że ludzie są bardziej zaznajomieni z Javą (b / c tego uczą na lekcjach CS) i nie są jeszcze tak wykwalifikowani w paradygmacie Scali.

Scala ma rekurencję ogona, może zwracać krotki (myślę, że może to być w Javie 8).

To nie ma porównania. Scala została opracowana przez Martina Ordersky'ego, który pracował w głównym zespole Java Generics.

Scala jest po prostu o wiele lepszym językiem. To wszystko. Ludzie, którzy twierdzą inaczej, po prostu nie zbadali Scali na tyle, by wiedzieć lepiej.

Powyżej chciałem powiedzieć o optymalizacji rekurencji ogona (czego JVM nie może zrobić w sposób, w jaki może kompilator Scali).

Scala także kompiluje i działa szybciej niż aplikacje JVM (Tak, to prawda). Nie wspominając o ramach. Korzystamy z Tomcat na przykład i wdrażamy niektóre serwulety do obsługi REST.

Jedną rzeczą, której Tomcat nie może zrobić, są operacje asynchroniczne, które wymagają nieblokujących operacji we / wy. W tym celu programiści JAVA zwykle wymyślili obejście za pomocą kolejki komunikatów (wyślij wiadomość do kolejki, a inny proces lub wątek odbierze ją i zrobi wszystko, co chcesz w tle).

Niestety, ta metoda to cr * p i włamanie do ograniczeń we wdrażaniu serwletów Java na Tomcat.

Idź sprawdź akka + spray. Korzysta z aktorów scali (aktorzy są jak wątki, z wyjątkiem, że jedynym sposobem, w jaki mogą się komunikować, są wiadomości).

I gotowe, asynchroniczne wywołania REST są łatwe. Długotrwałe zadanie w tle? Nie ma problemu. Po prostu odpal i zapomnij i raz na jakiś czas wykonaj odpytywanie REST, aby sprawdzić jego status z interfejsu.

Jeśli nadal używasz Javy i uważasz, że jest lepsza niż Scala, równie dobrze możesz przestać używać komputera do pisania i wrócić do czasów długopisów i pisania przy świecach. Java jest w zasadzie przedpotopowym w porównaniu ze Scalą.

Vic
źródło
4
To nie jest przykład zrozumienia listy. A w Javie piszesz:int myVar = condition ? someValue : otherValue
kevin cline
1
Powinieneś edytować te //some value //other valuekomentarze, aby /*some value*/nadać im styl lub coś. Obecnie
psuje to