文
章
目
录
章
目
录
学习使用 Stream.filter(Predicate) 方法遍历所有元素,并通过 Predicate 参数过滤出符合给定条件(通过 Predicate 参数定义)的所有项目。
1.Stream filter() 方法
stream() 方法语法如下:
Stream<T> filter(Predicate<? super T> condition)
Predicate 是一个函数式接口,表示从 Stream 中过滤出不匹配元素的条件。
- filter() 是一个中间流操作。
- 它返回一个由给定流中符合给定Predicate 的元素组成的流。
- filter() 参数应该是一个无状态的Predicate ,应用于流中的每个元素以确定是否应该包含该元素。
- Predicate 是一个函数式接口。因此,我们还可以传递 lambda 表达式。
- 它返回一个新的 Stream,这样我们就可以使用适用于任何流的其它操作。
2. Java Stream filter() 示例
2.1使用 Lambda 表达式过滤 Stream
在这个例子中,我们遍历一个数字流。我们将从流中找到所有偶数并打印到控制台。
内联谓词 ‘n -> n % 2 == 0’ 是一个 lambda 表达式。
import java.util.Arrays;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println);
}
}
输出:
2
4
6
8
10
2.2 使用自定义谓词过滤 Stream
这个例子重写了第一个例子。它使用 Predicate 类代替 lambda 表达式,尽管它们是相同的东西。
注意:我们可以在Predicate 中编写任何条件,以符合业务要求。
public class Main
{
public static void main(String[] args)
{
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> condition = new Predicate<Integer>()
{
@Override
public boolean test(Integer n) {
if (n % 2 == 0) {
return true;
}
return false;
}
};
list.stream().filter(condition).forEach(System.out::println); //246810
}
}
2.3 过滤并收集到 List 中
我们可以使用 collect(Collectors.toList()) 方法将过滤后的流的元素收集到列表中。
这个例子重写了第一个例子。在此,我们将偶数收集到列表中,而不是将它们打印到控制台。
public class Main
{
public static void main(String[] args)
{
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = list.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); //[2, 4, 6, 8, 10]
}
}
2.4. Stream filter() 和 map() 示例
我们可以使用 map() 方法来收集流元素,然后在将其收集到列表之前将每个数字转换为平方数。
public class Main
{
public static void main(String[] args)
{
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = list.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(evenNumbers);//[4, 16, 36, 64, 100]
}
}
2.5 Stream filter() 中带有抛出异常的方法
用于Predicate 的方法返回布尔值。这些方法通常进行简单的值比较,不会抛出任何异常。
但是,有时我们可能需要处理这种会抛出异常的方法,这种方法必须在 Predicate 中使用。
要解决这个问题,我们必须使用 try-catch 语句来捕获受检查的异常。然后我们有两种选择:要么处理该异常,要么将其重新抛出为未受检查的异常。
以下是处理 Predicate 中使用的受检查异常方法的代码示例:
List<Integer> evenNumbers = list.stream()
.filter(a -> {
try {
return a.someMethodThrowingCheckedException();
} catch (IOException e) {
throw new UncheckedException(e);
}
})
.collect(Collectors.toList());