Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.47 KB | None | 0 0
  1. package ru.swayfarer.swl.streams;
  2.  
  3. import java.util.HashSet;
  4. import java.util.TreeSet;
  5. import java.util.stream.Stream;
  6.  
  7. import ru.swayfarer.swl.collections.extended.IExtendedList;
  8. import ru.swayfarer.swl.functions.staticargs.Generated.IFunction1;
  9. import ru.swayfarer.swl.functions.staticargs.Generated.IFunction1NoR;
  10. import ru.swayfarer.swl.functions.staticargs.Generated.IFunction2;
  11.  
  12. /**
  13.  * Поток данных. Мой аналог Java-{@link Stream}
  14.  * @author swayfarer
  15.  */
  16. @SuppressWarnings("unchecked")
  17. public interface IDataStream<Element_Type> {
  18.    
  19.     /** Выполняются ли операции над данными парраллельно?*/
  20.     public boolean isParallel();
  21.  
  22.     /**
  23.      * Получить элемент по позиции. Дубль для {@link #get(int)}
  24.      * @param id Позиция элемента
  25.      * @return Полученный элемент
  26.      */
  27.     public default Element_Type at(int id)
  28.     {
  29.         return get(id);
  30.     }
  31.    
  32.     /**
  33.      * Получить элемент по позиции
  34.      * @param id Позиция элемента
  35.      * @return Полученный элемент
  36.      */
  37.     public Element_Type get(int id);
  38.    
  39.     /**
  40.      * Получить размер потока данных (кол-во элементов)
  41.      * @return Количество элементов в потоке данных
  42.      */
  43.     public int size();
  44.    
  45.     /**
  46.      * Содержит ли поток данных элемент?
  47.      * @param element Элемент, наличие которого проверяется
  48.      * @return True, если содержится, иначе False
  49.      */
  50.     public boolean contains(Element_Type element);
  51.    
  52.     /**
  53.      * Пустой ли поток данных?
  54.      * @return True, если пустой, иначе False
  55.      */
  56.     public boolean isEmpty();
  57.    
  58.     /**
  59.      * Вставить элемент в поток данных
  60.      * @param pos Позиция, на которую будет вставлен элемент
  61.      * @param element Элемент, который будет вставлен
  62.      * @return Поток данных с проведенными изменениями
  63.      */
  64.     public <T extends IDataStream<Element_Type>> T insert(int pos, Element_Type element);
  65.    
  66.     /**
  67.      * Получить позицию первого элемента в потоке данных
  68.      * @param element Элемент, позицию которого получаем
  69.      * @return Полученная позиция. -1, если элемент не был найден
  70.      */
  71.     public int indexOf(Element_Type element);
  72.    
  73.     /**
  74.      * Получить позицию первого элемента, подходящего под фильтр, в потоке данных
  75.      * @param filter Фильтр, через который проверяются элементы
  76.      * @return Полученная позиция. -1, если элемент не был найден
  77.      */
  78.     public int indexOf(IFunction1<? super Element_Type, Boolean> filter);
  79.    
  80.     /**
  81.      * Найти первый элемент, соответствующий фильтру
  82.      * @param filter Фильтр, по которому проверяем на соответствие
  83.      * @return Найденный элемент
  84.      */
  85.     public Element_Type find(IFunction1<? super Element_Type, Boolean> filter);
  86.    
  87.     /**
  88.      * Удалить все элементы, соотвествующие фильтру
  89.      * @param condition Фильтр, по которому проверяем на соответствие
  90.      * @return Поток данных с проведенными изменениями
  91.      */
  92.     public default <T extends IDataStream<Element_Type>> T removeAll(IFunction1<? super Element_Type, Boolean> condition)
  93.     {
  94.         return filtered((x) -> !condition.apply(x));
  95.     }
  96.    
  97.     /**
  98.      * Добавить элементы в начало потока данных
  99.      * @param elements Добавляемые элементы
  100.      * @return Поток данных с проведенными изменениями
  101.      */
  102.     public default <T extends IDataStream<Element_Type>> T prepend(Element_Type... elements)
  103.     {
  104.         int pos = 0;
  105.        
  106.         for (Element_Type element : elements)
  107.         {
  108.             insert(pos ++, element);;
  109.         }
  110.        
  111.         return (T) this;
  112.     }
  113.    
  114.     /**
  115.      * Добавить элементы в конец потока данных
  116.      * @param elements Добавляемые элементы
  117.      * @returnПоток данных с проведенными изменениями
  118.      */
  119.     public default <T extends IDataStream<Element_Type>> T append(Element_Type... elements)
  120.     {
  121.         int size = size();
  122.        
  123.         for (Element_Type element : elements)
  124.         {
  125.             insert(size++, element);;
  126.         }
  127.        
  128.         return (T) this;
  129.     }
  130.    
  131.     /**
  132.      * Отфильтровать поток данных
  133.      * @param condition Филтр, которому должны соответсвовать элементы
  134.      * @return Поток данных с проведенными изменениями
  135.      */
  136.     public <T extends IDataStream<Element_Type>> T filtered(IFunction1<? super Element_Type, Boolean> condition);
  137.    
  138.     /**
  139.      * Удалить все дублирующиеся элементы
  140.      * @param comparator Компаратор, по которому определяется соответствие элементов
  141.      * @return Поток данных с проведенными изменениями
  142.      */
  143.     public default <T extends IDataStream<Element_Type>> T distinct(IFunction2<? super Element_Type, ? super Element_Type, Integer> comparator)
  144.     {
  145.         return filtered(new TreeSet<Element_Type>(comparator.asJavaComparator())::add);
  146.     }
  147.    
  148.    
  149.     /**
  150.      * Удалить все дублирующиеся элементы
  151.      * @return Поток данных с проведенными изменениями
  152.      */
  153.     public default <T extends IDataStream<Element_Type>> T distinct()
  154.     {
  155.         return filtered(new HashSet<Element_Type>()::add);
  156.     }
  157.    
  158.     /**
  159.      * Отсортировать поток данных
  160.      * @param comparator Компаратор, по которому будут сортироваться элементы
  161.      * @return Поток данных с проведенными изменениями
  162.      */
  163.     public <T extends IDataStream<Element_Type>> T sorted(IFunction2<? super Element_Type, ? super Element_Type, Integer> comparator);
  164.    
  165.     /**
  166.      * Отсортировать поток данных
  167.      * @return Поток данных с проведенными изменениями
  168.      */
  169.     public <T extends IDataStream<Element_Type>> T sorted();
  170.    
  171.     /**
  172.      * Трансформировать элементы через ремаппер
  173.      * @param mapper Ремаппер. Функция, которая принимает объект и возвращает его трансформированную версию
  174.      * @return Поток данных с проведенными изменениями
  175.      */
  176.     public <New_Element_Type, T extends IDataStream<Element_Type>> T mapped(IFunction1<? super Element_Type, New_Element_Type> mapper);
  177.    
  178.     /**
  179.      * Оставить ограниченное число элементов
  180.      * @param max Максимум элементов
  181.      * @return Поток данных с проведенными изменениями
  182.      */
  183.     public default <T extends IDataStream<Element_Type>> T limit(int max)
  184.     {
  185.         return sub(0, max);
  186.     }
  187.    
  188.     /**
  189.      * Создать подпоток элементов, начинающимися с указанного индекса
  190.      * @param start Элемент, с которого будет заполняться новый поток
  191.      * @return Поток данных с проведенными изменениями
  192.      */
  193.     public default <T extends IDataStream<Element_Type>> T sub(int start)
  194.     {
  195.         return sub(start, size());
  196.     }
  197.    
  198.     /**
  199.      * Создать подпоток элементов, от и до указанных индексов
  200.      * @param start Элемент, с которого будет заполняться новый поток
  201.      * @param end Элемент, которым будет заканчиваться новый поток
  202.      * @return Поток данных с проведенными изменениями
  203.      */
  204.     public <T extends IDataStream<Element_Type>> T sub(int start, int end);
  205.    
  206.     /**
  207.      * Хотя бы один элемент удовлетворяет условию
  208.      * @param predicate Условие, на которое проверяются элементы
  209.      * @return True, если хотя бы один элемент удовлетворяет условию
  210.      */
  211.     public boolean someMatches(IFunction1<? super Element_Type, Boolean> predicate);
  212.    
  213.     /**
  214.      * Все элементы удовлетворяют условию
  215.      * @param predicate Условие, на которое проверяются элементы
  216.      * @return True, если все элементы удовлетворяют условию
  217.      */
  218.     public boolean matches(IFunction1<? super Element_Type, Boolean> predicate);
  219.    
  220.     /**
  221.      * Ни один элемент не удовлетворяет условию
  222.      * @param predicate Условие, на которое проверяются элементы
  223.      * @return True, если ни один элемент не удовлетворяет условию
  224.      */
  225.     public default boolean notMatches(IFunction1<? super Element_Type, Boolean> predicate)
  226.     {
  227.         return !matches(predicate);
  228.     }
  229.  
  230.     /**
  231.      * Выполнить функцию для всех элементов потока
  232.      * @param fun Функция, которая будет выполнена для всех элементов потока
  233.      * @return Поток данных после проведенных действий
  234.      */
  235.     public <T extends IDataStream<Element_Type>> T each(IFunction1NoR<? super Element_Type> fun);
  236.    
  237.     /**
  238.      * Получить лист элементов потока
  239.      * @return Лист элементов потока
  240.      */
  241.     public IExtendedList<Element_Type> toList();
  242.    
  243.     /**
  244.      * Получить Java-{@link Stream} с элементами этого потока
  245.      * @return Новый {@link Stream}
  246.      */
  247.     public default Stream<Element_Type> toJavaStream()
  248.     {
  249.         return toList().stream();
  250.     }
  251.    
  252.     /**
  253.      * Получить парраллельный Java-{@link Stream} с элементами этого потока
  254.      * @return Новый {@link Stream}
  255.      */
  256.     public default Stream<Element_Type> toJavaParrallelStream()
  257.     {
  258.         return toList().parallelStream();
  259.     }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement