Методи 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

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert