В этом уроке мы покажем вам несколько примеров Java 8, чтобы продемонстрировать использование потоков filter()
, collect()
, find Any()
и или иначе()
1. Потоки фильтруют() и собирают()
1.1 Перед Java 8 отфильтруйте Список
подобный этому:
package com.mkyong.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class BeforeJava8 { public static void main(String[] args) { Listlines = Arrays.asList("spring", "node", "mkyong"); List result = getFilterOutput(lines, "mkyong"); for (String temp : result) { System.out.println(temp); //output : spring, node } } private static List getFilterOutput(List lines, String filter) { List result = new ArrayList<>(); for (String line : lines) { if (!"mkyong".equals(line)) { // we dont like mkyong result.add(line); } } return result; } }
Выход
spring node
1.2 Эквивалентный пример в Java 8, stream.filter()
для фильтрации списка
и сбора()
для преобразования потока в Список
.
package com.mkyong.java8; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class NowJava8 { public static void main(String[] args) { Listlines = Arrays.asList("spring", "node", "mkyong"); List result = lines.stream() // convert list to stream .filter(line -> !"mkyong".equals(line)) // we dont like mkyong .collect(Collectors.toList()); // collect the output and convert streams to a List result.forEach(System.out::println); //output : spring, node } }
Выход
spring node
2. Потоки фильтруют(), находят любые() и или еще()
package com.mkyong.java8; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } //gettersm setters, toString }
2.1 До Java 8 вы получаете Человека
по имени, как это:
package com.mkyong.java8; import java.util.Arrays; import java.util.List; public class BeforeJava8 { public static void main(String[] args) { Listpersons = Arrays.asList( new Person("mkyong", 30), new Person("jack", 20), new Person("lawrence", 40) ); Person result = getStudentByName(persons, "jack"); System.out.println(result); } private static Person getStudentByName(List persons, String name) { Person result = null; for (Person temp : persons) { if (name.equals(temp.getName())) { result = temp; } } return result; } }
Выход
Person{name='jack', age=20}
2.2 Эквивалентный пример в Java 8, используйте stream.filter()
для фильтрации списка
и .findAny().OrElse (null)
для возврата условного объекта.
package com.mkyong.java8; import java.util.Arrays; import java.util.List; public class NowJava8 { public static void main(String[] args) { Listpersons = Arrays.asList( new Person("mkyong", 30), new Person("jack", 20), new Person("lawrence", 40) ); Person result1 = persons.stream() // Convert to steam .filter(x -> "jack".equals(x.getName())) // we want "jack" only .findAny() // If 'findAny' then return found .orElse(null); // If not found, return null System.out.println(result1); Person result2 = persons.stream() .filter(x -> "ahmook".equals(x.getName())) .findAny() .orElse(null); System.out.println(result2); } }
Выход
Person{name='jack', age=20} null
2.3 Для нескольких условий.
package com.mkyong.java8; import java.util.Arrays; import java.util.List; public class NowJava8 { public static void main(String[] args) { Listpersons = Arrays.asList( new Person("mkyong", 30), new Person("jack", 20), new Person("lawrence", 40) ); Person result1 = persons.stream() .filter((p) -> "jack".equals(p.getName()) && 20 == p.getAge()) .findAny() .orElse(null); System.out.println("result 1 :" + result1); //or like this Person result2 = persons.stream() .filter(p -> { if ("jack".equals(p.getName()) && 20 == p.getAge()) { return true; } return false; }).findAny() .orElse(null); System.out.println("result 2 :" + result2); } }
Выход
result 1 :Person{name='jack', age=20} result 2 :Person{name='jack', age=20}
3. Фильтр потоков() и карта()
package com.mkyong.java8; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class NowJava8 { public static void main(String[] args) { Listpersons = Arrays.asList( new Person("mkyong", 30), new Person("jack", 20), new Person("lawrence", 40) ); String name = persons.stream() .filter(x -> "jack".equals(x.getName())) .map(Person::getName) //convert stream to String .findAny() .orElse(""); System.out.println("name : " + name); List collect = persons.stream() .map(Person::getName) .collect(Collectors.toList()); collect.forEach(System.out::println); } }
Выход
name : jack mkyong jack lawrence
Рекомендации
- Циклический вывод Java 8 в моем случае
- Java 8 Объяснено: Использование фильтров, карт, потоков и Foreach для применения лямбда-выражений к коллекциям Java!
- Java 8 Примеры для каждого
- Потоки Java 8: несколько фильтров против сложного условия
- Обработка данных с помощью потоков Java SE 8
Оригинал: “https://mkyong.com/java8/java-8-streams-filter-examples/”