Ну, классы кейсов, безусловно, помогают, но, вероятно, самым большим вкладчиком является библиотека коллекций.Коллекции по умолчанию являются неизменяемыми, а методы направлены на манипулирование коллекциями путем создания новых вместо мутаций.Поскольку неизменяемые коллекции являются постоянными, для этого не требуется копирование всей коллекции, что часто приходится делать в Java.
Помимо этого, for-comp понимания - монадические понимания,что полезно при выполнении неизменяемых задач, есть оптимизация хвостовой рекурсии, что очень важно в неизменяемых алгоритмах, и общее внимание к неизменности во многих библиотеках, таких как комбинаторы синтаксического анализа и xml.
Наконец, обратите внимание, что вы должныпопросите var
, чтобы получить некоторую изменчивость.Параметры неизменны, и val
так же короток, как и var
.Сравните это с Java, где параметры являются изменяемыми, и вам нужно добавить ключевое слово a final
, чтобы получить неизменность.В то время как в Scala легче и легче оставаться неизменным, в Java легче оставаться изменчивым.
Приложение
Постоянные структуры данных это структуры данных, которые разделяют части между его модифицированными версиями.Это может быть немного трудно понять, поэтому давайте рассмотрим Scala List
, который довольно прост и понятен.
Scala List
состоит из двух классов, известных как cons и Nil
.Первый действительно написан ::
в Scala, но я буду называть его традиционным именем.
Nil
- пустой список.Он не содержит ничего.Методы, которые зависят от того, что список не пустой, такие как head
и tail
, генерируют исключения, в то время как другие работают нормально.
Естественно, cons должны тогда представлять непустой список,Фактически, cons имеет ровно два элемента: значение и список.Эти элементы известны как head и tail .
Таким образом, список из трех элементов состоит из трех cons , поскольку каждый cons будет содержать только одно значение плюс Nil
.Он должен иметь Nil
, потому что cons должен указывать на список.Поскольку списки не являются круглыми, то один из cons должен указывать на что-то отличное от cons .
Один из примеров такого списка:
val list = 1 :: 2 :: 3 :: Nil
Теперь компоненты Scala List
неизменны .Нельзя изменить ни значение, ни список cons .Одним из преимуществ неизменности является то, что вам никогда не нужно копировать коллекцию перед передачей или после получения ее каким-либо другим способом: вы знаете, что список не может измениться.
Теперь давайте рассмотрим, что произойдетесли бы я изменил этот список.Давайте рассмотрим две модификации: удаление первого элемента и добавление нового элемента.
Мы можем удалить один элемент с помощью метода tail
, имя которого вовсе не является совпадением.Итак, мы пишем:
val list2 = list.tail
И list2
будет указывать на тот же список, на который указывает list
tail .Ничего не было создано: мы просто повторно использовали часть list
.Итак, давайте добавим элемент к list2
тогда:
val list3 = 0 :: list2
Мы создали там cons .Этот новый cons имеет значение ( head ), равное 0, а его tail указывает на list2
.Обратите внимание, что list
и list3
указывают на один и тот же list2
.Эти элементы совместно используются обоими list
и list3
.
Существует много других постоянных структур данных.Тот факт, что данные, которыми вы манипулируете, является неизменным, облегчает совместное использование компонентов.
Более подробную информацию об этом можно найти в книге Криса Окасаки, Чисто функциональные структуры данных ,или на его в свободном доступе тезис с тем же именем.