Перейти к основному содержимому

Методы skip и limit

Метод skip(long n) используется для пропуска n элементов. Этот метод возвращает новый поток, в котором пропущены первые n элементов.

Метод limit(long n) применяется для выборки первых n элементов потоков. Этот метод также возвращает модифицированный поток, в котором не более n элементов.

Зачастую эта пара методов используется вместе для создания эффекта постраничной навигации. Рассмотрим, как их применять:

Stream<String> phoneStream = Stream.of("iPhone 6 S", "Lumia 950", "Samsung Galaxy S 6", "LG G 4", "Nexus 7");

phoneStream.skip(1)
.limit(2)
.forEach(s->System.out.println(s));

В данном случае метод skip пропускает один первый элемент, а метод limit выбирает два следующих элемента. В итоге мы получим следующий консольный вывод:

Lumia 950
Samsung Galaxy S 6

Вполне может быть, что метод skip может принимать в качестве параметра число большее, чем количество элементов в потоке. В этом случае будут пропущены все элементы, а в результирующем потоке будет 0 элементов.

И если в метод limit передается число, большее, чем количество элементов, то просто выбираются все элементы потока.

Теперь рассмотрим, как создать постраничную навигацию:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.*;
import java.util.Scanner;

public class Program {
public static void main(String[] args) {
List<String> phones = new ArrayList<String>();
phones.addAll(Arrays.asList(new String[] {
"iPhone 6 S",
"Lumia 950",
"Huawei Nexus 6P",
"Samsung Galaxy S 6",
"LG G 4",
"Xiaomi MI 5",
"ASUS Zenfone 2",
"Sony Xperia Z5",
"Meizu Pro 5",
"Lenovo S 850"
}));

int pageSize = 3; // количество элементов на странице
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("Введите номер страницы: ");
int page = scanner.nextInt();

if (page < 1) break; // если число меньше 1, выходим из цикла

phones.stream().skip((page - 1) * pageSize)
.limit(pageSize)
.forEach(s -> System.out.println(s));
}
}
}

В данном случае у нас набор из 10 элементов. С помощью переменной pageSize определяем количество элементов на странице - 3. То есть у нас получится 4 страницы (на последней будет только один элемент).

В бесконечном цикле получаем номер страницы и выбираем только те элементы, которые находятся на указанной странице.

Теперь введем какие-нибудь номера страниц, например, 4 и 2:

Введите номер страницы:
4
Lenovo S 850
Введите номер страницы:
2
Samsung Galaxy S 6
LG G 4
Xiaomi MI 5