Scala 2.9. Что нового?
Совсем скоро должна выйти новая версия популярного мультипарадигменного языка программирования Scala — Scala 2.9. На официальном сайте уже доступен release candidate, так что релиз не заставит себя долго ждать. В этой заметке я расскажу, что нового появится в этой версии Scala.
Параллельные коллекции
Параллельные коллекции, вероятно, самое большое нововведение в Scala 2.9. В параллельных коллекциях основные методы обработки (такие как map, foreach, fold, filter и другие) выполняются параллельно в нескольких потоках (количество которых зависит от количества ядер системы). Таким образом их производительность значительно возрастает (по сравнению со стандартными последовательными) на современных многоядерных системах. Параллельные коллекции органично вписаны в существующую архитектуру коллекций и расположены в пакете scala.collection.parallel.
Любая последовательная коллекция может быть преобразована в соответствующую параллельную с помощью метода par. Например, вот так можно распараллелить выполнение обычного for-each:
for(i<-(1to50).par) println("Process"+i)
О паралельных коллекциях можно посмотреть презентацию со Scala Day 2010
Обработчик в блоке catch
Теперь в блоке
trybody catchhandler finallycleaner handler может быть любым выражением, которое может быть преобразовано к <i>PartialFunction[Throwable, T]</i> (где T — тип результата body). Это позволяет написать общий обработчик и использовать его в нескольких блоках try-catch. Например valhandler:PartialFunction[Throwable,Unit]={ casee:Exception=>println("handled") caset:Throwable=>println("error") } trydoSomething() catchhandler trydoSomethingWrong() catchhandler
Трейты DelayedInit и App
Трейт DelayedInit позволяет отложить выполнение инициализирующего кода класса. Этот код передаётся в метод delayedInit, после чего может быть выполнен когда угодно. В частности, с помощью DelayedInit реализован трейт App как замена Application (который знаменит тем, что его повсеместно не рекомендовали использовать). App позволяет быстро сделать любой объект исполняемым. В отличие от Application теперь есть доступ к параметрам командной строки.
objectTestAppextendsApp{ println(args.mkString("")) }
Dynamic
Трейт Dynamic позволяет перехватывать и обрабатывать вызов методов, которые статически не определены в объекте. У объекта, к которому примешан Dynamic, можно вызвать любой метод meth. Если этот метод не определён в объекте, то будет вызван метод applyDynamic(«meth», args). Пример
classTestDynamicextendsDynamic{ defapplyDynamic(name:String)(args:Any*):Any={ println(name+"invokedwithargs:"+args.mkString("")) "test" } } valdyn=newTestDynamic println(dyn.qwerty("qqq",5)) println(dyn.some())
Dynamic является экспериментальной возможностью и чтобы его использовать нужно задать флаг компилятора -Xexperimental
Другие изменения
- Новые команды в REPL. :implicits выведет все implicits (не уверен, как правильно по-русски) в текущей области видимости. :keybidings отобразит горячие клавиши. :javap декомпилирует тип или класс-файл.
- Библиотека sbt.Proces теперь стала частью стандартной библиотеки Scala и находится в scala.sys.process. Process позволяет работать с внешними процессами (вызывать внешние команды и по-всякому их комбинировать). Примеры можно посмотреть здесь.
- Новые методы в коллекциях:
- collectFirst — ищет первый элемент, для которого определана PartialFunction и возвращает результат применения функции к элементу
- span — делит коллекцию на две части согласно условию
- inits — возвращает список коллекций, где перый элемент — текущая коллекция, а каждый последующий создаётся путём вызова init у предыдущего. List(1,2,3).inits = Iterator(List(1,2,3), List(1,2), List(1), Nil)
- tails — то же, что и предыдущий, но только применяется tail. List(1,2,3).tails = Iterator(List(1,2,3), List(2,3), List(3), Nil)
- maxBy, minBy — поиск максимального/минимального элемента после применения к элементам функции
- permutations — возвращает все перестановки элементов коллекции
- combinations — возвращает все сочетания указанной длины
- Аннотация @strictfp для того, чтобы вычисления с плавающей точкой выполнялись с одинаковой точностью независимо от платформы. Подробнее тут.
- Ну и как обычно исправлены ошибки и улучшена производительность.