Зачем использовать Scala поверх Java

16

Я полностью отношусь к Scala как к языку ... и все же я борюсь с тем, почему любая компания должна перейти с Java на Scala. Является ли Scala просто синтетическим сахаром на вершине JVM или есть фундаментальные улучшения в Scala по сравнению с Java, которые могли бы улучшить приложения реального мира?

Северная Дакота
источник
4
Это есть иметь дубликат где - то.
2
Похоже, вы использовали это (Scala) много (ну, больше, чем я) - что вы нашли в своем личном опыте?
FrustratedWithFormsDesigner
Я видел такие вопросы, как ... Что Java-разработчики думают о Scala, Что я должен делать дальше как Java-разработчик, Как начать миграцию с Java на Scala ... но не где я видел вопрос или ответ, который фокусируется на основных причинах использования Scala в качестве языка программирования для разработки в реальном мире.
Север Дакоты
1
@delnan, по крайней мере, на SO: stackoverflow.com/questions/6073517/… . @DakotahNorth, пожалуйста, не пересекайте сообщения между сайтами SE - выберите форум, наиболее подходящий для вашего вопроса, и размещайте сообщения только там. На других сайтах ваше сообщение в любом случае будет закрыто, как это было в случае с SO.
Петер Тёрёк
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 все еще ограничивается языком).

Честно говоря, я не могу думать слишком много о том, что делает Scala на голову выше Java. Да, много мелких достижений и улучшений, но и гораздо больше веревок, с которыми можно повеситься. YMMV

HTH немного

Мартейн Вербург
источник
3
Я хотел бы отметить, что akka (модель актера) доступна как для Scala, так и для Java. Смотрите akka.io
Джорджио
5
Мне нравится Scala, и я перехожу на него с Java. Тем не менее, меня бесит, когда сравнивают Java и Scala, и разработчики Scala стараются написать как можно более многословный и многострочный Java-код и очень стараются заменить его одним однострочником Scala. Без потери читаемости выше код Java мог уместиться в 5 строк, а не в 12
мат
2
«Множество небольших достижений и улучшений, да, но и гораздо больше веревок, чтобы повеситься». +1
Роб
@lucek Тем более, что во фрагменте кода используются условные скобки C вместо Java: P
Andres F.
@robjb: «Множество мелких достижений и улучшений, да, но и гораздо больше веревок, с которыми можно повеситься». Я не согласен, что Скала дает вам больше веревки, чтобы повеситься. По крайней мере, нет объяснения этому утверждению в ответе, и я сам не вижу его. Кроме того, Scala не просто вводит несколько функциональных идиом поверх языка OO (например, C # и Java 8), но и пытается объединить OOP и FP в одну парадигму. ИМХО это не "небольшие улучшения", а переключение парадигмы.
Джорджио
9

Это зависит от вашего определения «просто синтаксический сахар». Например, каким образом Java больше, чем просто синтаксический сахар над машинным кодом?

Любой язык может сделать меньше, чем машинный код, но ни один язык не может сделать больше.

То, что языки высокого уровня привносят в таблицу, делает код более легким для чтения и понимания, более простым для составления и обнаружения большего количества ошибок. И, на мой взгляд, это первый из них, который имеет наибольшее значение - именно «просто синтаксический сахар».

Но, учитывая только два других, Scala по-прежнему имеет преимущества перед Java.

Не говоря уже о сути, но наличие замыканий делает код более удобным для компоновки, чем отсутствие замыканий. И хотя Java 7 добавит нечто, называемое замыканиями, они не будут такими - они будут просто анонимными функциями.

Что касается выявления большего количества ошибок, превосходная обработка дисперсий в Scala является достаточным доказательством. Кроме того, его акцент на неизменяемости также предотвращает всевозможные ошибки - это не значит, что Java не может делать неизменяемыми, а просто не поставляется с библиотекой для этого.

Даниэль С. Собрал
источник
4
На самом деле «замыкания» Java не наступят до Java 8
Мартейн Вербург
1
@Martijn Спасибо за исправление. На данный момент мне уже все равно.
Даниэль С. Собрал
1
Я бы сказал, что синтаксический сахар - это просто альтернативный синтаксис поверх существующей семантики. Поскольку семантика машинного кода не включает объекты, классы и т. Д., Я думаю, что Java - это не просто синтаксический сахар над машинным кодом. Семантика и парадигма программирования разные.
Джорджио
@Martijn Verburg: Java уже имеет форму замыканий (в форме анонимных внутренних классов). Чего ему не хватает, так это анонимных функций (которые можно рассматривать как специальные анонимные классы с ровно одним методом и некоторым специальным синтаксисом).
Джорджио
@ Джорджио - правда, но внутренний класс anon неэффективен по сравнению с будущей реализацией на основе invokedynamic, и это хорошо, исходный код уродлив: IMO :-)
Martijn Verburg
2

В дополнение к ответу Martijn я хотел бы добавить, что Scala является более выразительным чем Java, и его преимущества заключаются в том, что (1) это делает вас более продуктивным (2) писать меньше кода для решения той же проблемы, что означает, что вы можете уменьшить количество ошибок в своем код (ИМХО без ошибок код является мифом).

sakisk
источник
0

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

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

или использовать замыкания как

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

Но, конечно, более многословно. Мне нравится вывод типа, хотя. Когда вы изучите Scala, вы поймете, что это, вероятно, то, что происходит в любом случае. На мой взгляд, каждый язык поставляется с + ve и -ve.

user105463
источник
-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.

Скала - это просто превосходный язык. Это все, что нужно сделать. Люди, которые говорят иначе, просто недостаточно изучили Scala, чтобы лучше узнать.

Выше я хотел сказать оптимизацию хвостовой рекурсии (что JVM не может сделать так, как это делает компилятор Scala).

Scala также компилируется и работает быстрее, чем приложения JVM (да, это правда). Не говоря уже о рамках. Например, мы используем Tomcat и развертываем несколько сервлетов для обработки REST.

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

К сожалению, этот метод - cr * p, и он взломал ограничения развертывания Java-сервлетов на Tomcat.

Иди проверь акка + спрей. В ней используются акторы scala (актеры похожи на потоки, за исключением того, что они могут общаться только через сообщения).

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

Если вы все еще используете Java и думаете, что это лучше, чем scala, вы можете также прекратить использовать компьютер для набора текста и вернуться к временам перьевых ручек и написания при свечах. Java в основном допотопный по сравнению со Scala.

Vic
источник
4
Это не пример понимания списка. А на Яве ты пишешь:int myVar = condition ? someValue : otherValue
Кевин Клайн
1
Вы должны отредактировать эти //some value //other valueкомментарии так, чтобы они были в /*some value*/стиле. В настоящее время он
портит