Akka Stream принцип работы и создание своих элементов

Данная статья посещена вопросам работы потока Akka Stream в целом и вопросу создание своих элементов для графов в частности. Изначально планировалось разобраться только с вопросом создания своего элемента графа с нужными свойствами, но параллельно получились отсылки к тому как поток работает. Сначала два слова о том из чего состоит Akka…

подробнее

Scala работа с файлами

Чтение файла Чтение файлов осуществляется классом scala.io.Source, при помощи которого можно получить поток данных из файла, как то поток строк или поток символов. Source.fromFile(“data.txt”) – вернет scala.io.BufferedSource экземпляр не пустого итератора. Source.fromFile(“data.txt”).mkString – вернет все содержимое файла как единую строку. Source.fromFile(“data.txt”).getLines.foreach { x => println(x) }; – вернет итератор со строками файла…

подробнее

Akka актеры как элементы Akka Stream

Akka Stream состоит из трех элементов источника (Source), поточных элементов (Flow) и приемников (Sink). Соответственно в каждом из этих элементов может использоваться актер Akka. Документация, к сожалению, не пестрит большим количеством примеров как реализовать элементы потока из актеров. Источник Source Начнем с источника данных потока:

В данном примере реализован…

подробнее

Scala Trait

Trait в Scala это что то среднее между интерфейсом java и абстрактным классом. Фактически  Trait  может практически все тоже, что и абстрактный класс, но в тоже время им доступны все роли интерфейсов. В самом простом случае Trait это эквивалент интерфейса java:

В этом случае Trait содержит только публичные и абстрактные методы, при…

подробнее

Location, Location, Location

 

Данный код выведет следующий результат:

Hello null
I repeat: Hello Readers
Hello Readers
I repeat: Hello Readers

Такое поведение объясняться следующим: при создании дочернего элемента от супер класса или трейта, родительский конструктор будет выполнен перед первой строкой дочернего конструктора, но только после завершения объявления класса. Иначе говоря присвоение в поле трейта audience выполняется в классе BMember, уже внутри конструктора, а значит что родительский код сработает до присвоения и выведет на экран значение пол умолчанию для поля (это null). Во втором случае присвоение полю находиться внутри описания класса, которое сработает перед вызовом родительского конструктора, и мы получим нормальный ожидаемый вывод.

Обработка ошибок с типом TRY

Появился в Scala 2.10.0 и был портирован в Scala 2.9.3.

Как и в других языках Scala позволяет производить выбрасывание исключений:

 

Выброшенные исключения могут быть отловлены и обработаны с помощью блоков Try/Catch содержащих частично применяемые функции, которые указывают на типы, исключений, которые мы хотим обработать. Кроме того, в scala блок Try/Catch – это выражение которое может иметь результат.

Например, так:

 

Обработка ошибок функциональным способом

Обработка ошибок классическим способом плохо сочетается с функциональным программированием, такой подход также очень плохо сочетается с параллелизмом. Например, в системе Акторов, если исключение происходит в другом акторе, то это означает, что Вы не можете поймать это исключение, так как оно находиться в другом потоке выполнения, но информация об ошибке не должна теряться.

Для решения таких задач в Scala предусмотрена возможность возвращать значение соответствующе ошибке из функций. Это достигается применением типа Try включенного в состав Scala. Кроме того, существует более обобщенный тип Either.

подробнее

Опциональный тип Option

Иногда при работе с Java возникает NullPointerException, это происходит потому, что некоторые методы могут возвращать null, а не ожидаемое вами значение и такое поведение не проверяется в использующем такую функцию коде. Значение null часто используется для представления отсутствующего значения.

При этом подобные концепции встречаться и в других языках, более того некоторые языки (например: Groovy) имеют встроенную поддержку конструкций для работы с такими значениями.

Scala пошла другим путем и создала свой тип для представления того, что значение может быть или его может не быть это трейт Option[A].

Option[A] – это контейнер для значения типа A, при этом если значение присутствует, то Option[A] – это экземпляр Some[A] содержащий значение типа A . Если значение отсутствует то Option[A] – это объект None.

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

подробнее

Операторы/методы языка Scala

В скала нет понятия оператор, есть понятие метода. Все операторы сводятся к вызовам методов.

Особенности вызовов методов (в том числе и операторных)

Если метод имеет один параметр, то его можно вызвать:

S.indexOf(“eee”)

А можно вызвать как (упустив точку и скобки вокруг аргументов):

S indexOf “eee”

Если аргументов несколько, то можно упустить точку:

S indexOf (5,“eee”)

Если у метода нет параметров то можно упустить точку и/или скобки:

Вместо 7.toString() написать 7 toString или 7.toString

подробнее