Streams filter 例子

在本教程中,我们将向你展示一些java 8个例子来演示的流filter(),collect()使用,findany()和orelse().

1. Streams filter() and collect()

1.1 Java 8之前, 过滤一 List 如下所示 :

BeforeJava8.java

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) { List<String> lines = Arrays.asList("spring", "node", "mkyong"); List<String> result = getFilterOutput(lines, "mkyong"); for (String temp : result) { System.out.println(temp); //output : spring, node } } private static List<String> getFilterOutput(List<String> lines, String filter) { List<String> result = new ArrayList<>(); for (String line : lines) { if (!"mkyong".equals(line)) { // we dont like mkyong result.add(line); } } return result; } }

Output

spring
node

1.2 在java 8,流等效的例子。filter()过滤列表,和collect()一起转换流到一个List中。

NowJava8.java

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) { List<String> lines = Arrays.asList("spring", "node", "mkyong"); List<String> 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 } }

Output

spring
node

2. Streams filter(), findAny() and orElse() Person.java

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之前, 你会像下面示例的样子获取一个Person 对象 :

BeforeJava8.java

package com.mkyong.java8; import java.util.Arrays; import java.util.List; public class BeforeJava8 { public static void main(String[] args) { List<Person> persons = 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<Person> persons, String name) { Person result = null; for (Person temp : persons) { if (name.equals(temp.getName())) { result = temp; } } return result; } }

Output

Person{name='jack', age=20}

2.2  在java 8使用流等效的例子, 用stream.filter() 过滤List .findAny().orElse (null) 返回一个对象的条件。

NowJava8.java

package com.mkyong.java8; import java.util.Arrays; import java.util.List; public class NowJava8 { public static void main(String[] args) { List<Person> persons = 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); } }

Output

Person{name='jack', age=20}
null

2.3 多个条件.

NowJava8.java

package com.mkyong.java8; import java.util.Arrays; import java.util.List; public class NowJava8 { public static void main(String[] args) { List<Person> persons = 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); } }

Output

result 1 :Person{name='jack', age=20}
result 2 :Person{name='jack', age=20}

3. Streams filter() and map()

NowJava8.java

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) { List<Person> persons = 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<String> collect = persons.stream() .map(Person::getName) .collect(Collectors.toList()); collect.forEach(System.out::println); } }

Output

name : jack

mkyong
jack
lawrence

强烈推荐这–处理数据流教程  – 
Processing Data with Java SE 8 Streams

References

  1. Java 8 cyclic inference in my case
  2. Java 8 Explained: Using Filters, Maps, Streams and Foreach to apply Lambdas to Java Collections!
  3. Java 8 forEach examples
  4. Java 8 Streams: multiple filters vs. complex condition
  5. Processing Data with Java SE 8 Streams
    原文作者:wangmm0218
    原文地址: https://blog.csdn.net/wangmuming/article/details/72630250
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞