Scala 2.9. Что нового?

28 апреля 2011 г.

Совсем скоро должна выйти новая версия популярного мультипарадигменного языка программирования 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 для того, чтобы вычисления с плавающей точкой выполнялись с одинаковой точностью независимо от платформы. Подробнее тут.
  • Ну и как обычно исправлены ошибки и улучшена производительность.
Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики