Stream API Flashcards
(6 cards)
Основные функциональные интерфейсы
Consumer: T -> void
Supplier: () -> T
Predicate: P -> boolean
UnaryOperator: T -> T
Function: T -> R
Те же интерфейсы с приставкой Bi принимают по два значения.
Для работы с примитивами используются соответствующие функциональные интерфейсы (например IntPredicate, IntToDoubleFunction, IntUnaryOperator и т.д.)
Порядок применения лямбд
Лямбда-выражение можно присвоить переменной или передать в метод, ожидающий в качестве аргумента функциональный интерфейс.
Шаг 1. Создаём функциональный интерфейс. В качестве аргумента принимает дженерик Т
interface MyFunction<T> { T apply(T t);}</T>
Шаг 2. Создаём метод Х, который реализует этот функциональный интерфейс (реализуем функцию). Параметры метода – дженерики.
static <T> T doSomething(T value, MyFunction<T> function) {return function.apply(value);}</T></T>
Шаг 3. Создаём переменную У с типом функционального интерфейса. Переменная при помощи лямбда-выражения запускает работу метода. Конкретизируем тип дженерика.
MyFunction<String> upper = s -> s.toUpperCase();</String>
Шаг 4. Создаём переменную с типом Метода Х. Передаём в неё результат работы метода Х. Метод Х в качестве одного из аргументов принимает переменную У.
String result = doSomething(“java”, upper);
Потоки vs структуры ранных
Структуры данных - Хранение, структурирование, многократное использование
Потоки - обработка данных, однократность использования
Создание потоков
Stream.of(…) Создаёт поток из элементов
Числовые диапазоны
.range(a, b) и
.rangeClosed(a, b) включает границы диапазона
Бесконечные потоки
Stream.iterate(…)
Строит бесконечную последовательность, начиная с начального значения и применяя к нему функцию (unaryOperator) (0, n -> n + 1)
Stream.generate(…)
Бесконечно генерирует значения, вызывая Supplier (например, случайные числа) Stream.generate(Math::random)
Files.lines(Path) Поток строк файла
Создание потока из объекта, допускающего null
.ofNullable()
Промежуточные методы потоков
filter(Predicate)
Отбирает элементы по условию
map(Function)
Преобразует каждый элемент
flatMap(Function)
«Сплющивает» вложенные потоки
Усечение потока данных
distinct() : Удаляет дубликаты
limit(n): Ограничивает количество элементов
skip(n): Пропускает первые n элементов
Поиск и сопоставление с шаблоном
allMatch, anyMatch, noneMatch, findFirst и findAny
Сортировка
sorted() / sorted(Comparator)
Если список отсортирован
.takeWhile() до определённого элемента,
.dropWhile() после определённого элемента
Преобразование в поток примитивов
mapToInt, mapToDouble и mapToLong
Преобразование потоков примитивов
.boxed()
Для отладки — посмотреть элементы по ходу
peek(Consumer)
Терминальные методы потоков
forEach(Consumer)
Выполняет действие для каждого элемента
toArray()
Преобразует поток в массив
collect(Collector)
Собирает элементы в коллекцию (например, List)
reduce(…)
Агрегирует значения потока элементов в один итоговый результат (например, сумма)
count()
Возвращает количество элементов
IntStream, DoubleStream и LongStream. Имеют специализированные методы для работы с числами (sum, max, min, average и т.д.)
Поиск и сопоставление с шаблоном
.allMatch()
.anyMatch()
.noneMatch()
.findFirst()
.findAny()
noneMatch(Predicate) Ни один не соответствует
findFirst() / findAny() Возвращает первый или любой элемент (обёрнутый в Optional)