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 (подсчет количества символов в текстовом файле без учета регистра):

+

copy sample
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"));
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)

+

copy sample
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;
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;

Макрофайлы

Collectors

..\mac\extra\StreamApi\Collectors.mac

Объекты коллекторы

Импорты

Реализация списка на основе массива TArray

Файл включает в себя реализацию интерфейса map через два массива

Библиотека коллекций для языка RSL

Файл включает в себя реализацию классического интерфейса map через хэш-таблицу

Файл включает в себя реализацию классического интерфейса set, коллекцию уникальных значений

Базовые классы и функции коллекций

Файл включает в себя реализацию классов LinkedHashMap

Файл включает в себя реализацию LinkedHashSet - коллекции уникальных элементов с сохранением порядка добавления

Файл включает в себя реализацию связного списка LinkedList и отсортированного связного списка SortedLinkedList

Файл включает в себя реализацию классического интерфейса map через красно-черное дерево

Реализация отсортированной коллекции уникальных значений

Библиотека для динамического создания функций из строковых шаблонов

Реализованные функции-компараторы (compare и equals)

Реализация исключений и блоков try/catch/finally

Вспомогательные классы и функции для реализации ООП паттернов

Релизация функций для сортировки массива

Объекты коллекторы

Утилиты для работы с массивами TArray

Расширение стандартного класса TArray. Реализует всю базовую функциональность, за исключением переопределенного метода sort()

Полезные утилиты для работы со строковыми переменными

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

Имена

class

..\mac\extra\StreamApi\Stream.mac

Any

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\collections\ArrayList.mac

class

..\mac\extra\collections\ArrayMap.mac

var

..\mac\extra\utils\ArrayUtils.mac

class

..\mac\extra\StreamApi\Stream.mac

macro

..\mac\extra\OOP\SortingFunc.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

class

..\mac\extra\OOP\Comparators.mac

class

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

class

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

const

..\mac\extra\StreamApi\Collectors.mac

class

..\mac\extra\StreamApi\Stream.mac

class

..\mac\extra\StreamApi\Collectors.mac

macro

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\collections\Iterable.mac

class

..\mac\extra\OOP\Exceptions.mac

macro

..\mac\extra\OOP\SortingFunc.mac

macro

..\mac\extra\lambda\Lambda.mac

macro

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\collections\HashMap.mac

class

..\mac\extra\collections\HashMap.mac

class

..\mac\extra\collections\HashSet.mac

class

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\OOP\Exceptions.mac

macro

..\mac\extra\OOP\OOP.mac

macro

..\mac\extra\collections\HashMap.mac

macro

..\mac\extra\collections\HashSet.mac

class

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\collections\Iterable.mac

class

..\mac\extra\collections\Iterable.mac

macro

..\mac\extra\lambda\Lambda.mac

const

..\mac\extra\lambda\Lambda.mac

class

..\mac\extra\collections\LinkedHashMap.mac

class

..\mac\extra\collections\LinkedHashSet.mac

class

..\mac\extra\collections\LinkedList.mac

class

..\mac\extra\collections\Iterable.mac

macro

..\mac\extra\collections\LinkedList.mac

macro

..\mac\extra\collections\LinkedList.mac

class

..\mac\extra\collections\Iterable.mac

class

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\collections\Iterable.mac

class

..\mac\extra\OOP\Exceptions.mac

macro

..\mac\extra\OOP\OOP.mac

macro

..\mac\extra\OOP\OOP.mac

macro

..\mac\extra\collections\HashMap.mac

class

..\mac\extra\collections\Iterable.mac

const

..\mac\extra\collections\Iterable.mac

class

..\mac\extra\utils\SArray.mac

class

..\mac\extra\collections\Iterable.mac

macro

..\mac\extra\OOP\Exceptions.mac

macro

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\collections\LinkedList.mac

macro

..\mac\extra\StreamApi\Stream.mac

macro

..\mac\extra\StreamApi\Stream.mac

class

..\mac\extra\utils\StringUtils.mac

macro

..\mac\extra\OOP\OOP.mac

macro

..\mac\extra\collections\HashMap.mac

macro

..\mac\extra\collections\HashSet.mac

class

..\mac\extra\utils\StringUtils.mac

const

..\mac\extra\utils\StringUtils.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\StreamApi\Stream.mac

macro

..\mac\extra\OOP\Exceptions.mac

macro

..\mac\extra\OOP\OOP.mac

macro

..\mac\extra\collections\HashMap.mac

class

..\mac\extra\collections\TreeMap.mac

class

..\mac\extra\collections\TreeMap.mac

class

..\mac\extra\collections\TreeMap.mac

class

..\mac\extra\collections\TreeSet.mac

Try

class

..\mac\extra\OOP\Exceptions.mac

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\OOP\OOP.mac

class

..\mac\extra\OOP\Exceptions.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\Comparators.mac

macro

..\mac\extra\OOP\OOP.mac

macro

..\mac\extra\StreamApi\Stream.mac