Stream API Flashcards

(6 cards)

1
Q

Основные функциональные интерфейсы

A

Consumer: T -> void
Supplier: () -> T
Predicate: P -> boolean
UnaryOperator: T -> T
Function: T -> R

Те же интерфейсы с приставкой Bi принимают по два значения.

Для работы с примитивами используются соответствующие функциональные интерфейсы (например IntPredicate, IntToDoubleFunction, IntUnaryOperator и т.д.)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Порядок применения лямбд

A

Лямбда-выражение можно присвоить переменной или передать в метод, ожидающий в качестве аргумента функциональный интерфейс.

Шаг 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);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Потоки vs структуры ранных

A

Структуры данных - Хранение, структурирование, многократное использование

Потоки - обработка данных, однократность использования

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Создание потоков

A

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()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Промежуточные методы потоков

A

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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Терминальные методы потоков

A

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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly