Package StreamApi
..\mac\extra\StreamApi\Stream.mac
Реализация Stream Api. В большинстве своём схож с Java Stream Api. Реализует самые полезные методы для создания цепочек ленивых вычислений.
Создать Stream можно следующими способами
- методом .toStream(), если он реализован у класса объекта например (SArray, Collections).
- вызовом функции StreamOf(obj). Obj может быть массивом TArray, Iterable, объектом TStreamDoc, строкой String, объектом таблицы бд TbFile.
- реализовав итератор для любого класса с методами (next() : Variant, hasNext() : Bool) и передав его инстанс в конструктор класса BornStream.
После создания Stream, как обычно, через точку пишем методы :
- конвеерные методы (тэг Conveyor)
- агрегирующие методы (тэг Agregate)
- терминальный метод (тэг Terminal), который запускает выполнение Stream и возвращает результат.
Во всех методах где необходимо передать ссылку на функцию, можно использовать лямбды, имя функции с @ перед именем, ссылкой на метод R2M или ссылку на функцию через @.
О чем следует помнить:
- Стрим не запускает конвеер вычислений до добавление в цепочку терминального метода.
- После того как стрим завершил работу, повторно запустить его не получится. Нужно создать заново.
- При передаче параметра как ссылки метода объекта класса (через R2M), следует помнить, что объект должен существовать в момент вызова метода. Т.е объект необходимо поместить в память, например в переменную или массив, чтобы его не уничтожил GC.
Использование библиотеки помогает существенно сократить время написания аналитических отчетов (время исполнения чаще всего тоже), однако при использовании "на постоянку" желательно не использовать лямбды, чтобы не использовать HDD (все лямбды можно описать как маленькие функции).
В виду того, что RSL - динамически типизирован, рекомендуется потренироваться в использовании на языке со статической типизацией (Java, Scala, Kotlin, C#).
Пример1 (подсчет количества символов в текстовом файле без учета регистра):
+

import "..\\mac\\extra\\StreamApi\\Stream.mac";
var fl = TStreamDoc("../mac/Extra/_samples/stream/testText.txt", "R", "rsansi");
var res = StreamOf(fl) // Создаем стрим строк файла
.flatMap("l -> StreamOf(l)") // преобразуем в стрим символов
.collect(Collectors.counting("StrUpr(it)", V_STRING)) // Собираем в LinkedHasMap
.sort(); // Сортируем по ключу (символу)
res.toScreen2();
println("total: " + res.sumByProp("value"));
Пример2 (Поиск дупликатов в бд client.dbt)
+

import "..\\mac\\extra\\StreamApi\\Stream.mac";
import bankInter;
var db_client = Tbfile("client.dbt", "R", 0, null, "bank.def");
var arr = StreamOf(db_client) // Создаём stream из файла бд
.rewind()
.map("Tupple2(it.Name_Client, it.Code)")
.groupByString("StrUpr(it._1)")
.filter("p -> p.value.size > 1")
.map("it.value")
.toArray(); // Соберём в массив
// Выведем на экран
for (var i, 0, arr.size-1, 1)
println(i + 1 + " : ");
for (var t, arr[i])
println(" (" + t._2 + ")" + t._1);
end;
end;
Макрофайлы
Импорты
Файл включает в себя реализацию интерфейса map через два массива
Библиотека коллекций для языка RSL
Файл включает в себя реализацию классического интерфейса map через хэш-таблицу
Файл включает в себя реализацию классического интерфейса set, коллекцию уникальных значений
Базовые классы и функции коллекций
Файл включает в себя реализацию классов LinkedHashMap
Файл включает в себя реализацию LinkedHashSet - коллекции уникальных элементов с сохранением порядка добавления
Файл включает в себя реализацию связного списка LinkedList и отсортированного связного списка SortedLinkedList
Файл включает в себя реализацию классического интерфейса map через красно-черное дерево
Реализация отсортированной коллекции уникальных значений
Библиотека для динамического создания функций из строковых шаблонов
Реализованные функции-компараторы (compare и equals)
Реализация исключений и блоков try/catch/finally
Вспомогательные классы и функции для реализации ООП паттернов
Релизация функций для сортировки массива
Объекты коллекторы
Полезные утилиты для работы со строковыми переменными
bankinter
rcw
rsexts
Функции
macro StreamLoadedMarker ()
Функция-маркер для проверки загрузки библиотеки #Stream
macro StreamOf (obj)
Создает и возвращает Stream из объекта или примитива obj. Если создать стрим не возможно, бросается исключение IllegalArgumentException
macro zipStreams (s1 : ContinuedStream, s2 : ContinuedStream, bifunc)
Создает стрим из двух стримов s1 и s2 и объединяет их элементы согласно функции bifunc
Классы
Private Class StreamInterface ()
Базовый класс для всех стримов, описывает методы доступные для всех наследников
Private Class (StreamInterface) ContinuedStream ()
Базовый класс для агрегатных и конвеерных стримов
Class (ContinuedStream) BornStream (iterator)
Базовый класс для стримов рождающих потоки
Class (ContinuedStream) ConveyorStream ()
Базовый класс для конвеерных стримов
Class (ContinuedStream) AgregateStream ()
Базовый класс для агрегатных стримов
Class (StreamInterface) TerminalStream ()
Базовый класс для терминальных стримов (запускающих и завершающих)
Private Class (BornStream) TBFileStream (_tbFile)
Класс для создания стрима из объекта TBFile