Навіщо використовувати Scala над Java


16

Я повністю розглядаю Scala як мову ... і все ще борюся з тим, чому будь-яка компанія повинна перейти з Java на Scala. Чи є Scala просто синтатичним цукром на вершині JVM чи є фундаментальні вдосконалення Scala щодо Java, які б покращили додатки в реальному світі?


4
Це є мати дублікат де - то.

2
Здається, ви багато використовували його (Скала) (ну, більше, ніж я) - що ви знайшли в особистому досвіді?
FrustratedWithFormsDesigner

Я бачив такі питання, як ... Що розробники Java думають про Scala, що мені робити далі як розробник Java, як почати міграцію з Java на Scala ... але там, де я не бачив питання або відповідь, яка зосереджена на рушійних причинах використання Scala як мови програмування для розвитку реального світу.
Дакота Північ

1
@delnan, по крайней мере , на SO: stackoverflow.com/questions/6073517 / ... . @DakotahNorth, будь ласка, не перекладайте повідомлення між веб-сайтами SE - виберіть форум, який найкраще підходить для вашого запитання, і публікуйте лише там. На інших сайтах ваша публікація все одно буде закрита, як це сталося з цим повідомленням на SO.
Péter Török

1
Ось ще один, майже точний дублікат SO, з чудовими відповідями: stackoverflow.com/questions/2683914/…
Péter Török

Відповіді:


19

Відмова: Я не гуру Скали.

Scala дуже добре робить дві речі, яких у Java (на даний момент) немає.

Вирішити функціональні задачі

  • На самому базовому рівні, Scala повністю закрила закриття з підтримкою колекцій. Це означає, що вам більше не доведеться писати код пластини котла на зразок (безсоромно зірвавши з посади 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;
    }

Але замість цього напишіть щось на кшталт:

def bought(user: User) = items.filter(user bought _)
  • Є більш функціональна любов, але я не кваліфікований, щоб говорити про це, оскільки в даний час я все ще підхоплюю функціональне програмування :)

Вирішіть паралельність більш безпечним способом

  • У Scala є модель акторів (+ деяка інша користь), яка в спадковому порядку безпечніша за змінні дані Java + блокування в моделі Thread (незалежно від того, наскільки хороші губи отримують, Java все ще заважає мові).

Я не можу чесно подумати над іншим, що змушує Скалу стояти головою і плечима над Явою. Так, невеликі виграші та вдосконалення, але також набагато більше мотузки, на яку можна повіситись. YMMV

HTH трохи


3
Я хотів би зазначити, що акка (модель актора) доступна і для Scala, і для Java. Дивіться akka.io
Джорджіо

5
Мені подобається Скала, і я мігрую до неї з Java. І все-таки це мене дратує, коли порівнюють Java та Scala, а розробники Scala намагаються написати як можна більш багатослівний та багаторядковий код Java і дуже намагаються замінити його на один лайнер Scala. Без втрати читабельності вище код Java міг би вміститися в 5 рядках, а не 12
мат

2
"Багато невеликих вигод і вдосконалень, так, але також набагато більше мотузки, щоб повісити себе". +1
Роб

@lucek Тим більше, що фрагмент використовує фігурні фігурні дужки C замість Java: P
Андрес Ф.

@robjb: "Багато малих вигод та покращень, так, але також набагато більше мотузки, з якою можна повіситися". Я не згоден, що Скала дає вам більше мотузки, щоб повіситись. Принаймні, пояснення цього твердження у відповіді немає, і я його не бачу сам. Крім того, Scala не просто вводить кілька функціональних ідіом на основі мови OO (наприклад, C # і Java 8), вона намагається інтегрувати OOP і FP в одну парадигму. ІМХО, це не "невеликі вдосконалення", а скоріше парадигма.
Джорджіо

9

Це залежить від вашого визначення поняття "просто синтаксичний цукор". Наприклад, чим Ява більше, ніж просто синтаксичний цукор над машинним кодом?

Будь-яка мова може зробити менше ніж машинний код, але жодна мова не може зробити більше.

Що мови високого рівня вносять у таблицю, це полегшує читання та розуміння коду, простіше складати та вловлювати більше помилок. І, на мою думку, саме це найбільше має значення - саме "просто синтаксичний цукор".

Але, враховуючи лише два інших, все ж є переваги Scala над Java.

Не заважати суті, але, якщо закриття робить код способом більш компонованим, ніж відсутність закриття. І поки Java 7 додасть щось, що називається закриттям, вони не будуть цим - вони будуть просто анонімними функціями.

Що стосується того, щоб зафіксувати більше помилок, то вищий доказ Scala у використанні дисперсії є достатньою доказовою спробою. Крім того, його акцент на незмінюваності також запобігає різного роду помилок - справа не в тому, що Java не може зробити непорушну, але просто не приходить до бібліотеки.


4
Насправді "закриття" Яви відбувається не тільки до Java 8
Мартійн Вербург

1
@Martijn Дякую за виправлення На даний момент я насправді вже не хвилююся.
Даніель К. Собрал

1
Я б сказав, що синтаксичний цукор - це лише альтернативний синтаксис поверх існуючої семантики. Оскільки семантика машинного коду не включає об’єкти, класи тощо, я думаю, що Java - це не просто синтаксичний цукор над машинним кодом. Парадигма семантики та програмування різна.
Джорджо

@Martijn Verburg: Java вже має форму закриття (у формі анонімних внутрішніх класів). Що йому бракує - це анонімні функції (які можна вважати спеціальними анонімними класами саме з одним методом та деяким спеціальним синтаксисом).
Джорджіо

@Giorgio - правда, але внутрішній клас anon погано працює в порівнянні з майбутнім запрошенням на основі викликів, і це добре, вихідний код потворний IMO :-)
Martijn Verburg,

2

На додаток до відповіді Мартійна, я хотів би додати, що Scala є більш виразним, ніж Java, і переваги полягають у тому, що (1) це робить вас більш продуктивним (2) писати менше коду для вирішення тієї ж проблеми, це означає, що ви можете зменшити помилки у вашій код (код помилок IMHO - це міф).


0

Я використовую Scala вже близько 3 місяців і досі не можу знайти нічого, чого не міг би зробити на Java. Для мене буквально кожна література по Scala , здається, говорячи те ж саме , шаблонний . Якщо ви шукаєте, це зменшити котельну плиту, то Scala - це для вас, але IMHO, наприклад, наведений вище приклад фільтра так само добре можна вирішити за допомогою колекцій apache

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

або використовувати такі закриття

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

Але звичайно більше багатослівного. Мені подобається висновок про тип. Коли ви дізнаєтесь Scala, ви зрозумієте, що це, мабуть, все, що відбувається під кришкою. На мою думку, кожна мова йде з + ве та -ве.


-3

список розуміння, для розуміння.

наприклад у java ви пишете:

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

У scala, той самий код, написано набагато елегантніше (як python), як:

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

і зробили.

Там так багато, що Scala пропонує, що Java ні. Просто немає порівняння взагалі. Єдина проблема полягає в тому, що люди більше знайомі з Java (це те, чого вони навчають у класах CS) і не настільки кваліфіковані з парадигмою Scala.

У Scala є хвоста рекурсія, вона може повертати кортежі (те, що може бути в Java 8, я думаю).

Це не порівняння. Scala був розроблений Мартіном Ордерським, який працював над основною командою для Java Generics.

Скала - це просто набагато перевершена мова. Це все, що там є. Люди, які говорять інакше, просто не вивчили Скалу, щоб знати краще.

Вище я мав на увазі сказати оптимізацію хвостової рекурсії (яку JVM не може зробити так, як зможе компілятор Scala).

Також Scala збирає та працює швидше, ніж програми JVM (Так, це правда). Не кажучи вже про рамки. Наприклад, ми використовуємо Tomcat і розгортаємо кілька сервлетів для обробки REST.

Одне, що Tomcat не може зробити, - це асинхронні операції, які вимагають не блокувати введення-виведення. Для цього розробники JAVA зазвичай винайшли вирішення за допомогою черги повідомлень (надішліть повідомлення в чергу, а якийсь інший процес або потік підбирає його та робить все, що завгодно у фоновому режимі).

На жаль, цей метод є cr * p, і хак через обмеження розгортання сервлетів Java на Tomcat.

Ідіть перевірити акку + спрей. Він використовує "Актори скали" (Актори так само, як нитки, за винятком єдиного способу спілкування - через повідомлення).

Асинхронні REST-дзвінки зроблено легко. Довго працююче фонове завдання? Без проблем. Просто стріляйте і забудьте, і зробіть декілька REST-опитувань, щоб перевіряти його стан від переднього кінця раз у раз.

Якщо ви все ще використовуєте Java і вважаєте, що це краще, ніж скала, ви можете також перестати користуватися комп’ютером для набору тексту та повернутися до часів ручки для писання та написання при свічках. Java в основному допотопний порівняно зі Scala.


4
Це не приклад розуміння списку. А на Яві ви пишете:int myVar = condition ? someValue : otherValue
kevin cline

1
Ви повинні відредагувати ці //some value //other valueкоментарі до /*some value*/стилю чи чогось іншого. Наразі
псується
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.