原文: https://beginnersbook.com/2017/10/java-8-stream-filter/

在上一个教程中,我们了解了 Java 流 。在完成本教程之前,我建议您阅读该指南。在本指南中,我们将讨论 Java 流过滤器。 filter()是一个中间操作,它从流中读取数据并在根据给定条件转换数据后返回新流。让我们先看一个简单的例子,然后我们将看到流过滤器的其他方法的示例。

Java 流的filter()的一个简单示例

在这个例子中,我们使用stream()方法从名称列表创建一个流,然后我们使用流的filter()创建另一个长名称流。如上所述,流过滤器将一个流的数据转换为另一个流。

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.stream.Stream;
  4. public class Example {
  5. public static void main(String[] args) {
  6. List<String> names = Arrays.asList("Melisandre","Sansa","Jon","Daenerys","Joffery");
  7. //Creating the stream of all names
  8. Stream<String> allNames = names.stream();
  9. //Creating another stream by filtering long names using filter()
  10. Stream<String> longNames = allNames.filter(str -> str.length() > 6);
  11. //displaying the long names
  12. longNames.forEach(str->System.out.print(str+" "));
  13. }
  14. }

输出:

  1. Melisandre Daenerys Joffery

让我们再看几个 Java 流过滤器的例子。

示例 1:流的filter()collect()

我们可以创建一个流并在一行中应用过滤器,如下例所示。这里的collect()方法收集最终流并将其转换为列表

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class Example {
  5. public static void main(String[] args) {
  6. List<String> names = Arrays.asList("Melisandre","Sansa","Jon","Daenerys","Joffery");
  7. List<String> longnames = names.stream() // converting the list to stream
  8. .filter(str -> str.length() > 6) // filter the stream to create a new stream
  9. .collect(Collectors.toList()); // collect the final stream and convert it to a List
  10. longnames.forEach(System.out::println);
  11. }
  12. }

输出:

  1. Melisandre
  2. Daenerys
  3. Joffery

示例 2:具有多个条件的流filter()

在上面的例子中,我们已经看到filter()方法中只有一个条件。我们可以在使用 java 中的逻辑运算符连接的filter()方法中有多个条件。在下面的示例中,我们在使用和(&&)逻辑运算符连接的filter方法中有两个条件。

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class Example {
  5. public static void main(String[] args) {
  6. List<String> names = Arrays.asList("Melisandre","Sansa","Jon","Daenerys","Joffery");
  7. List<String> longnames = names.stream()
  8. .filter(str -> str.length() > 6 && str.length() < 8) //Multiple conditions
  9. .collect(Collectors.toList());
  10. longnames.forEach(System.out::println);
  11. }
  12. }

输出:

  1. Joffery

示例 3:Java 中的流的filter()map()方法

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class Example {
  5. public static void main(String[] args) {
  6. List<Integer> num = Arrays.asList(1,2,3,4,5,6);
  7. List<Integer> squares = num.stream()
  8. .map(n -> n * n)
  9. .collect(Collectors.toList());
  10. System.out.println(squares);
  11. }
  12. }

输出:

  1. [1, 4, 9, 16, 25, 36]

更多 Java 流过滤器的教程:

  1. Java 8 - 按键和值过滤映射
  2. Java 8 - 从流中过滤空值