Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ru.swayfarer.swl.streams;
- import java.util.HashSet;
- import java.util.TreeSet;
- import java.util.stream.Stream;
- import ru.swayfarer.swl.collections.extended.IExtendedList;
- import ru.swayfarer.swl.functions.staticargs.Generated.IFunction1;
- import ru.swayfarer.swl.functions.staticargs.Generated.IFunction1NoR;
- import ru.swayfarer.swl.functions.staticargs.Generated.IFunction2;
- /**
- * Поток данных. Мой аналог Java-{@link Stream}
- * @author swayfarer
- */
- @SuppressWarnings("unchecked")
- public interface IDataStream<Element_Type> {
- /** Выполняются ли операции над данными парраллельно?*/
- public boolean isParallel();
- /**
- * Получить элемент по позиции. Дубль для {@link #get(int)}
- * @param id Позиция элемента
- * @return Полученный элемент
- */
- public default Element_Type at(int id)
- {
- return get(id);
- }
- /**
- * Получить элемент по позиции
- * @param id Позиция элемента
- * @return Полученный элемент
- */
- public Element_Type get(int id);
- /**
- * Получить размер потока данных (кол-во элементов)
- * @return Количество элементов в потоке данных
- */
- public int size();
- /**
- * Содержит ли поток данных элемент?
- * @param element Элемент, наличие которого проверяется
- * @return True, если содержится, иначе False
- */
- public boolean contains(Element_Type element);
- /**
- * Пустой ли поток данных?
- * @return True, если пустой, иначе False
- */
- public boolean isEmpty();
- /**
- * Вставить элемент в поток данных
- * @param pos Позиция, на которую будет вставлен элемент
- * @param element Элемент, который будет вставлен
- * @return Поток данных с проведенными изменениями
- */
- public <T extends IDataStream<Element_Type>> T insert(int pos, Element_Type element);
- /**
- * Получить позицию первого элемента в потоке данных
- * @param element Элемент, позицию которого получаем
- * @return Полученная позиция. -1, если элемент не был найден
- */
- public int indexOf(Element_Type element);
- /**
- * Получить позицию первого элемента, подходящего под фильтр, в потоке данных
- * @param filter Фильтр, через который проверяются элементы
- * @return Полученная позиция. -1, если элемент не был найден
- */
- public int indexOf(IFunction1<? super Element_Type, Boolean> filter);
- /**
- * Найти первый элемент, соответствующий фильтру
- * @param filter Фильтр, по которому проверяем на соответствие
- * @return Найденный элемент
- */
- public Element_Type find(IFunction1<? super Element_Type, Boolean> filter);
- /**
- * Удалить все элементы, соотвествующие фильтру
- * @param condition Фильтр, по которому проверяем на соответствие
- * @return Поток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T removeAll(IFunction1<? super Element_Type, Boolean> condition)
- {
- return filtered((x) -> !condition.apply(x));
- }
- /**
- * Добавить элементы в начало потока данных
- * @param elements Добавляемые элементы
- * @return Поток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T prepend(Element_Type... elements)
- {
- int pos = 0;
- for (Element_Type element : elements)
- {
- insert(pos ++, element);;
- }
- return (T) this;
- }
- /**
- * Добавить элементы в конец потока данных
- * @param elements Добавляемые элементы
- * @returnПоток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T append(Element_Type... elements)
- {
- int size = size();
- for (Element_Type element : elements)
- {
- insert(size++, element);;
- }
- return (T) this;
- }
- /**
- * Отфильтровать поток данных
- * @param condition Филтр, которому должны соответсвовать элементы
- * @return Поток данных с проведенными изменениями
- */
- public <T extends IDataStream<Element_Type>> T filtered(IFunction1<? super Element_Type, Boolean> condition);
- /**
- * Удалить все дублирующиеся элементы
- * @param comparator Компаратор, по которому определяется соответствие элементов
- * @return Поток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T distinct(IFunction2<? super Element_Type, ? super Element_Type, Integer> comparator)
- {
- return filtered(new TreeSet<Element_Type>(comparator.asJavaComparator())::add);
- }
- /**
- * Удалить все дублирующиеся элементы
- * @return Поток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T distinct()
- {
- return filtered(new HashSet<Element_Type>()::add);
- }
- /**
- * Отсортировать поток данных
- * @param comparator Компаратор, по которому будут сортироваться элементы
- * @return Поток данных с проведенными изменениями
- */
- public <T extends IDataStream<Element_Type>> T sorted(IFunction2<? super Element_Type, ? super Element_Type, Integer> comparator);
- /**
- * Отсортировать поток данных
- * @return Поток данных с проведенными изменениями
- */
- public <T extends IDataStream<Element_Type>> T sorted();
- /**
- * Трансформировать элементы через ремаппер
- * @param mapper Ремаппер. Функция, которая принимает объект и возвращает его трансформированную версию
- * @return Поток данных с проведенными изменениями
- */
- public <New_Element_Type, T extends IDataStream<Element_Type>> T mapped(IFunction1<? super Element_Type, New_Element_Type> mapper);
- /**
- * Оставить ограниченное число элементов
- * @param max Максимум элементов
- * @return Поток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T limit(int max)
- {
- return sub(0, max);
- }
- /**
- * Создать подпоток элементов, начинающимися с указанного индекса
- * @param start Элемент, с которого будет заполняться новый поток
- * @return Поток данных с проведенными изменениями
- */
- public default <T extends IDataStream<Element_Type>> T sub(int start)
- {
- return sub(start, size());
- }
- /**
- * Создать подпоток элементов, от и до указанных индексов
- * @param start Элемент, с которого будет заполняться новый поток
- * @param end Элемент, которым будет заканчиваться новый поток
- * @return Поток данных с проведенными изменениями
- */
- public <T extends IDataStream<Element_Type>> T sub(int start, int end);
- /**
- * Хотя бы один элемент удовлетворяет условию
- * @param predicate Условие, на которое проверяются элементы
- * @return True, если хотя бы один элемент удовлетворяет условию
- */
- public boolean someMatches(IFunction1<? super Element_Type, Boolean> predicate);
- /**
- * Все элементы удовлетворяют условию
- * @param predicate Условие, на которое проверяются элементы
- * @return True, если все элементы удовлетворяют условию
- */
- public boolean matches(IFunction1<? super Element_Type, Boolean> predicate);
- /**
- * Ни один элемент не удовлетворяет условию
- * @param predicate Условие, на которое проверяются элементы
- * @return True, если ни один элемент не удовлетворяет условию
- */
- public default boolean notMatches(IFunction1<? super Element_Type, Boolean> predicate)
- {
- return !matches(predicate);
- }
- /**
- * Выполнить функцию для всех элементов потока
- * @param fun Функция, которая будет выполнена для всех элементов потока
- * @return Поток данных после проведенных действий
- */
- public <T extends IDataStream<Element_Type>> T each(IFunction1NoR<? super Element_Type> fun);
- /**
- * Получить лист элементов потока
- * @return Лист элементов потока
- */
- public IExtendedList<Element_Type> toList();
- /**
- * Получить Java-{@link Stream} с элементами этого потока
- * @return Новый {@link Stream}
- */
- public default Stream<Element_Type> toJavaStream()
- {
- return toList().stream();
- }
- /**
- * Получить парраллельный Java-{@link Stream} с элементами этого потока
- * @return Новый {@link Stream}
- */
- public default Stream<Element_Type> toJavaParrallelStream()
- {
- return toList().parallelStream();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement