Java Stream filter

Веб-разработка на Java Программирование и разработка

Пример потока:

    pencil, ink, customary, people, cat. cake, forestry

Если этот поток нужно отфильтровать, чтобы в результате были только слова, длина которых превышает пять символов, то результат будет таким:

pencil, customary, people, forestry

Другой пример потока:

dog, bat, null, field, country, null, superposition

Если этот поток должен быть отфильтрован так, чтобы нулевые значения не присутствовали, то результатом будет:

dog, bat, field, country, superposition

Еще один пример потока:

1, 2, 3, 4, 5, 6, 7, 8

Если этот поток нужно отфильтровать так, чтобы в результате не было числа, меньшего или равного 5, то результат будет таким:

6, 7, 8

Поток — это последовательность элементов. Источником потока может быть массив, коллекция или ввод с жесткого диска или сети. Фильтрация потока означает удаление определенных элементов на основе определенных критериев. Такой критерий при кодировании представляет собой функцию и называется предикатом.

Predicate

Предикат — это функция, результатом которой является истина или ложь. Для потока,

pencil, ink, customary, people, cat, cake, forestry

предикат фильтра иметь только слова, длина которых больше 5, может быть:

word -> word.length() > 5

word является фиктивной переменной и представляет каждое слово в потоке. Такая функция со стрелкой -> называется лямбда-выражением. Эта функция интерпретируется как слова, каждое из которых имеет длину больше 5. Метод length класса строки возвращает длину строки.

Слова читаются одно за другим, и для каждого случая, если длина слова больше 5, все это выражение (от «слова» до 5) будет истинным; в противном случае все выражения приведут к ложному результату.

Для потока,

dog, bat, null, field, country, null, superposition

предикат фильтра для ненулевых слов может быть:

word -> word != null

Это выражение означает, что адресованное слово не равно null.

Для потока целых чисел

1, 2, 3, 4, 5, 6, 7, 8

предикат фильтра, чтобы не было числа, меньшего или равного 5:

number -> number >= 6

где число относится к каждому числу (по очереди). Это означает, что любое выбранное число должно быть больше или равно 6.

При фильтрации элементов потока программист должен знать не только кодировку предикатов. Программист также должен знать, какие структуры создают поток и как создается поток. Массив или коллекция является источником потока. Не забывайте, что компьютерные операции ввода-вывода также могут создавать поток; однако в этой статье это не рассматривается.

Some Stream producing Structures

Array

Массивы — это класс, предназначенный для обработки массивов. Методы Arrays принимают фактический массив в качестве одного из своих аргументов. Массивы, как класс, имеют следующий метод:

public static <T> List<T> asList(T… a)

Это статический метод, то есть объект Arrays не создается. Этот метод возвращает список. Список можно рассматривать как нефильтрованный или фильтрованный поток, но это не настоящий поток. Например, в следующем операторе lst, созданный из необработанного источника целых чисел, подобен нефильтрованному потоку:

List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

Объект List имеет метод создания нефильтрованного потока с теми же элементами списка, но в виде потока — см. ниже.

Collection

Примерами коллекций являются ArrayList и Vector. Сам список представляет собой коллекцию общего назначения.

ArrayList

ArrayList как класс имеет следующий метод:

default Stream<E> stream()

Этот метод возвращает объект потока. Следующий сегмент кода иллюстрирует это:

            ArrayList<String> al = new ArrayList<String>();
al.add(«dog»); al.add(«bat»); al.add(null); al.add(«field»);
al.add(«country»); al.add(null); al.add(«superposition»);

Stream<String> stre = al.stream();

stre — нефильтрованный поток.

List

Список на самом деле является интерфейсом; это не класс. Однако его объект может быть возвращен методом статического массива asList(), как показано выше. Объект List имеет метод stream(), аналогичный методу объекта ArrayList. В следующем сегменте кода показано, как объект List может возвращать поток:

            Vector<String> vtr = new Vector<String>();
vtr.add(«pencil»); vtr.add(«ink»); vtr.add(«customary»); vtr.add(«people»);
vtr.add(«cat»); vtr.add(«cake»); vtr.add(«forestry»);

List<String> lst = vtr.subList(0, vtr.size());
Stream<String> stre = lst.stream();

Объект List здесь возвращается методом subList() вектора.

Примечание. Класс Arrays, класс ArrayList, класс Vector и интерфейс List находятся в пакете java.util.*, который следует импортировать. Однако интерфейс Stream находится в пакете java.util.stream.* (символ s в нижнем регистре), который также следует импортировать.

Метод filter()

Таким образом, объект ArrayList или List может создавать поток, используя свои методы stream(). Что может создать объект List? Класс Arrays и класс Vector могут создавать объекты List. Класс Arrays использует свой метод asList(), а класс Vector использует свой метод subList().

Stream — это интерфейс, а не класс. Объект Stream возвращается методом потока объекта List или объекта ArrayList. Объект потока имеет метод filter() для фильтрации. Его аргументом является предикат. Новый поток, возвращаемый методом filter, является отфильтрованным потоком.

Объект Stream имеет множество методов. Два из них: count() и forEach(). Метод count() возвращает количество элементов в потоке, а метод forEach() используется для сканирования элементов потока.

Программа Java должна начинаться с:

    import java.util.*;
import java.util.stream.*;

Фильтрация строк больше длины

Следующий код показывает, как это сделать:

            Vector<String> vtr = new Vector<String>();
vtr.add(«pencil»); vtr.add(«ink»); vtr.add(«customary»); vtr.add(«people»);
vtr.add(«cat»); vtr.add(«cake»); vtr.add(«forestry»);
List<String> lst = vtr.subList(0, vtr.size());
Stream<String> stre = lst.stream();

Stream<String> strea = stre.filter(word -> word.length() > 5);
strea.forEach(element -> System.out.print(element + » «));
System.out.println();

Метод forEach() использует лямбда-функцию, предикатом которой на этот раз не является. Отфильтрованный вывод:

    pencil customary people forestry

Фильтрация нулевых значений

Следующий код показывает, как это можно сделать:

            ArrayList<String> al = new ArrayList<String>();
al.add(«dog»); al.add(«bat»); al.add(null); al.add(«field»);
al.add(«country»); al.add(null); al.add(«superposition»);
Stream<String> stre = al.stream();

Stream<String> strea = stre.filter(word -> word != null);
strea.forEach(element -> System.out.print(element + » «));
System.out.println();

Результат:

    dog bat field country superposition

Фильтрация больших целых чисел

Следующий код иллюстрирует это:

            List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
Stream<Integer> stre = lst.stream();

Stream<Integer> strea = stre.filter(number -> number >= 6);
strea.forEach(element -> System.out.print(element + » «));
System.out.println();

Результат:

    6 7 8

Заключение

Класс Arrays может создать объект List с помощью метода asList(). Класс Vector может создать объект List с помощью своего метода subList(). Каждый объект List и ArrayList имеет метод stream(). Метод потока возвращает нефильтрованный поток. Возвращаемый объект Stream имеет метод filter(), который принимает предикат (критерий фильтрации). Метод filter возвращает отфильтрованный поток.

Читайте также:  Использование Python для анализа данных электронной таблицы
Оцените статью
bestprogrammer.ru
Добавить комментарий