Методи 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()` — об’єднує два потоки в один.Ці методи допомагають ефективно керувати потоком даних, дозволяючи виділяти підпотоки та об’єднувати кілька потоків для подальшої обробки.

Отримання підтоку та об’єднання потоківМетоди skip та limit