Scala 2.9. Что нового?
Совсем скоро должна выйти новая версия популярного мультипарадигменного языка программирования Scala — Scala 2.9. На официальном сайте уже доступен release candidate, так что релиз не заставит себя долго ждать. В этой заметке я расскажу, что нового появится в этой версии Scala.
Параллельные коллекции
Параллельные коллекции, вероятно, самое большое нововведение в Scala 2.9. В параллельных коллекциях основные методы обработки (такие как map, foreach, fold, filter и другие) выполняются параллельно в нескольких потоках (количество которых зависит от количества ядер системы). Таким образом их производительность значительно возрастает (по сравнению со стандартными последовательными) на современных многоядерных системах. Параллельные коллекции органично вписаны в существующую архитектуру коллекций и расположены в пакете scala.collection.parallel.
Любая последовательная коллекция может быть преобразована в соответствующую параллельную с помощью метода par. Например, вот так можно распараллелить выполнение обычного for-each:
1 2 | for (i<-( 1 to 50 ).par) println( "Process" +i) |
О паралельных коллекциях можно посмотреть презентацию со Scala Day 2010
Обработчик в блоке catch
Теперь в блоке
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 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 теперь есть доступ к параметрам командной строки.
1 2 3 | objectTestAppextendsApp{ println(args.mkString( "" )) } |
Dynamic
Трейт Dynamic позволяет перехватывать и обрабатывать вызов методов, которые статически не определены в объекте. У объекта, к которому примешан Dynamic, можно вызвать любой метод meth. Если этот метод не определён в объекте, то будет вызван метод applyDynamic(«meth», args). Пример
01 02 03 04 05 06 07 08 09 10 | 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 для того, чтобы вычисления с плавающей точкой выполнялись с одинаковой точностью независимо от платформы. Подробнее тут.
- Ну и как обычно исправлены ошибки и улучшена производительность.