Методи skip та limit
Отримання підтоку та об’єднання потоків. Методи `skip()` та `limit()` у Stream API
Stream API дозволяє маніпулювати потоками різними способами, включаючи отримання певного діапазону елементів (підтоку) та об’єднання потоків. Методи `skip()` і `limit()` допомагають керувати кількістю елементів у потоці, а об’єднання потоків дозволяє працювати з кількома потоками як із єдиним цілим.
1. Отримання підтоку (використання методів `skip()` та `limit()`)
- `skip(long n)` — пропускає перші `n` елементів потоку і повертає потік, що починається з (n+1)-го елемента. Якщо кількість елементів у потоці менша за `n`, повертається порожній потік.
- `limit(long maxSize)` — обмежує кількість елементів у потоці до `maxSize`. Якщо в потоці менше елементів, ніж значення `maxSize`, то повертається повний потік.
Приклад використання `skip()` та `limit()`:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Пропустимо перші 3 елементи та отримаємо наступні 4
List<Integer> subList = numbers.stream()
.skip(3) // пропускаємо перші 3 елементи: [4, 5, 6, 7, 8, 9, 10]
.limit(4) // беремо наступні 4 елементи: [4, 5, 6, 7]
.collect(Collectors.toList());
System.out.println(“Підток: ” + subList);
}
}
Виведення:
Підток: [4, 5, 6, 7]
У цьому прикладі перші 3 елементи було пропущено за допомогою `skip(3)`, і потім було отримано лише наступні 4 елементи через `limit(4)`.
2. Об’єднання потоків (`Stream.concat()`)
Метод `Stream.concat()` дозволяє об’єднувати два потоки в один. Це корисно, коли ви маєте два потоки даних і хочете обробити їх як один.
Синтаксис:
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
Приклад об’єднання потоків:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<String> names1 = Arrays.asList(“Ольга”, “Іван”);
List<String> names2 = Arrays.asList(“Марія”, “Олег”);
// Об’єднуємо два потоки
Stream<String> combinedStream = Stream.concat(names1.stream(), names2.stream());
// Виводимо об’єднаний потік на екран
List<String> allNames = combinedStream.collect(Collectors.toList());
System.out.println(“Об’єднаний потік: ” + allNames);
}
}
Виведення:
Об’єднаний потік: [Ольга, Іван, Марія, Олег]
У цьому прикладі два потоки імен об’єднано в один потік за допомогою `Stream.concat()`.
3. Комбінування `skip()` і `limit()` для отримання частини потоку
Методи `skip()` і `limit()` можна використовувати разом для отримання частини потоку. Це особливо корисно для посторінкової обробки даних (пагінації), коли потрібно отримати певну сторінку даних із колекції.
Приклад посторінкової обробки:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int pageNumber = 2; // номер сторінки (починається з 1)
int pageSize = 3; // кількість елементів на сторінці
// Отримаємо елементи для 2-ї сторінки (позиції 4, 5, 6)
List<Integer> page = numbers.stream()
.skip((pageNumber – 1) * pageSize) // пропускаємо попередні сторінки
.limit(pageSize) // беремо потрібну кількість елементів
.collect(Collectors.toList());
System.out.println(“Елементи сторінки: ” + page);
}
}
Виведення:
Елементи сторінки: [4, 5, 6]
У цьому прикладі ми пропустили перші три елементи (сторінка 1) і отримали три наступні (сторінка 2). Це чудовий спосіб реалізувати пагінацію.
4. Альтернативи `Stream.concat()` для об’єднання потоків
Існують й інші способи об’єднання потоків, наприклад:
Об’єднання декількох потоків за допомогою `Stream.of()`:
Stream<String> combinedStream = Stream.of(names1.stream(), names2.stream())
.flatMap(stream -> stream);
Це дає той самий результат, що й `Stream.concat()`, але дозволяє об’єднувати кілька потоків (більше двох) в одну операцію.
Висновок
- `skip()` — пропускає перші N елементів потоку.
- `limit()` — обмежує кількість елементів у потоці.
- `Stream.concat()` — об’єднує два потоки в один.Ці методи допомагають ефективно керувати потоком даних, дозволяючи виділяти підпотоки та об’єднувати кілька потоків для подальшої обробки.