Статьи

Java 8 фильтр и карта и пример сбора и потока

Привет, ребята, многие из моих читателей написали мне письмо, чтобы написать пост о функции карты и фильтра Java 8, потому что им было трудно понять и использовать. Несмотря на то, что я ранее писал о map () и filter () , я снова пишу этот пост, чтобы объяснить концепцию на более понятном языке для лучшего понимания моих читателей и коллег-разработчиков Java.

Функция map () — это метод в классе Stream, который представляет концепцию функционального программирования. Проще говоря, map() используется для преобразования одного объекта в другой с помощью функции .

По этой причине Stream.map(Function mapper) принимает функцию в качестве аргумента. Например, используя функцию map (), вы можете преобразовать список строк в список целых чисел, применяя метод Integer.valueOf () к каждой строке в списке ввода.

Все, что вам нужно, это функция отображения для преобразования одного объекта в другой, и функция map () выполнит преобразование за вас.

Это также промежуточная операция потока, которая означает, что вы можете вызывать другие методы Stream, такие как фильтр, или собирать их для создания цепочки преобразования.

Теперь, перейдя к фильтрующему методу, как следует из его названия, он фильтрует элементы по условию, которое вы ему дали. Например, если ваш список содержит числа и вы хотите только четные числа, вы можете использовать метод фильтра для единственного числа выбора, которое полностью делится на два.

Метод фильтра по существу выбирает элементы на основе предоставленного вами условия По этой причине filter(Predicate condition) принимает объект Predicate, который предоставляет функцию для применения условия. Если условие оценивается как true, тогда объект выбирается, в противном случае он игнорируется.

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

Метод filter () также ленив, что означает, что он не будет оцениваться до тех пор, пока вы не вызовете метод редукции, такой как collect, и остановится, как только достигнет цели.

1. Как использовать карту и фильтр в Java 8

Вам нужен хороший пример, чтобы понять новую концепцию, и именно поэтому вы читаете эту статью. Поскольку String и Integer являются наиболее распространенным типом данных в Java, я выбрал простой и интересный пример.

У меня есть список строк, который представляет собой числа, например, {"1", "2", "3", "4", "5", "6"} Я хочу обработать этот список и мне нужен еще один список целых чисел с четным номера

Чтобы найти четное число, мне сначала нужно преобразовать список строк в список целых чисел, и для этого я могу использовать метод map () класса java.util.Stream, но перед этим нам понадобится Stream как map() определяется в java.util.stream. Стрим класс.

Но это совсем не сложно, так как вы можете получить поток из любой коллекции, например List или Set, вызвав метод stream (), потому что он определен в интерфейсе java.util.Collection .

Метод map(Function mapper) принимает функцию , технически говоря, объект java.util.function.Function interface . Затем эта функция применяется к каждому элементу Stream для преобразования в нужный вам тип.

Поскольку нам нужно преобразовать String в Integer, мы можем передать либо Integer.parseInt() либо Integer.valueOf() в функцию map() . Я выбрал метод valueOf() из-за причин, которые я упомянул в статье parseInt против valueOf, т.е. производительности и кэширования.

Затем map() вернет поток целых чисел, который содержит как четные, так и нечетные числа. Чтобы выбрать только четные числа, мы можем использовать метод filter() . Требуется объект Predicate, который технически является функцией для преобразования объекта в логическое значение . Я имею в виду, что мы передадим объект, и он вернет true или false. фильтр использует эту информацию для включения объекта в поток результатов.

Таким образом, чтобы включить только четные числа, мы называем filter( number -> number%2==0) что означает, что каждое число будет разделено на ноль, и если нет остатка, то он будет выбран.

Мы почти закончили, но пока у нас есть поток четных целых чисел, а не список четных целых чисел, и поэтому нам нужно использовать метод collect () , который собирает элементы из Stream в указанную коллекцию.

Поскольку нам нужен список, я вызвал collect(Collectors.toList()) который соберет все четные числа в список и вернет их. Теперь вы можете подумать, как узнать, что он возвращает список целых чисел, так что он получает эту информацию по выводу типа, потому что мы уже указали это, сохраняя результат в List<Integer> .

2. Пример Java 8 Map + Filter + Collect

Вот Java-программа для реализации всего, что я сказал в предыдущем разделе. Вы можете запустить эту программу в IDE или из командной строки и увидеть результат. Вы также можете поэкспериментировать с использованием дополнительных функций map() или большего количества вызовов filter() чтобы сделать композицию более длинной и сложной. Вы даже можете поиграть с методом collect() чтобы получить результат в виде списка, набора, карты или любой другой коллекции.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package tool;
 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 *
 * A simple Java Program to demonstrate how to use map and filter method Java 8.
 * In this program, we'll convert a list of String into a list of Integer and
 * then filter all even numbers.
 */
public class Hello {
 
  public static void main(String[] args) {
 
    List<String> numbers = Arrays.asList("1", "2", "3", "4", "5", "6");
    System.out.println("original list: " + numbers);
 
    List<Integer> even = numbers.stream()
                                .map(s -> Integer.valueOf(s))
                                .filter(number -> number % 2 == 0)
                                .collect(Collectors.toList());
 
    System.out.println("processed list, only even numbers: " + even);
 
  }
 
}
 
Output
original list: [1, 2, 3, 4, 5, 6]
the processed list, only even numbers: [2, 4, 6]

Вы можете видеть, что исходный список содержит числа от 1 до 6, а отфильтрованный список содержит только четные числа, то есть 2, 4 и 6.

Наиболее важным кодом в этом примере являются следующие 4 строки кода обработки потока:

Этот код сначала делает карту, а затем фильтрует и, наконец, собирает. Вы можете задаться вопросом, будет ли порядок иметь значение или нет, ну, это так. Поскольку для нашего условия фильтра требуется переменная int, нам сначала нужно преобразовать Stream of String в Stream of Integer , поэтому мы сначала вызвали функцию map() .

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

Если бы нам нужно было выполнить фильтрацию по строке, например, выбрать всю строку length > 2 то мы бы вызвали фильтр перед отображением.

Это все о том, как использовать карту и фильтр в Java 8 . Мы видели интересный пример того, как мы можем использовать карту для преобразования объекта в другой и фильтрации для выбора объекта на основе условия. Мы также узнали, как составлять операции в потоке для написания кода, который является одновременно ясным и лаконичным.

Спасибо за чтение этого урока до сих пор. Если вам нравится этот пример карты Java 8 + фильтр и мое объяснение, поделитесь с друзьями и коллегами. Если у вас есть какие-либо вопросы или пожелания, напишите нам.

Смотрите оригинальную статью здесь: Java 8 фильтр + карта + сбор + поток Пример

Мнения, высказанные участниками Java Code Geeks, являются их собственными.