filter()是一个中间操作,可以与 reduce()、collect()、map() 等一起使用。filter一般适用于list集合,主要作用就是模拟sql查询,从集合中查询想要的数据。
java官方文档语法如下。
filter(Predicate predicate)
它返回Stream的实例,该实例在处理Predicate后包含过滤后的数据。它被用作中间操作。filter()可用于许多不同的场景。如果我们想根据任何条件筛选list, array 或map,我们可以使用 lambda 表达式和 filter() 方法轻松完成。
接下来我们通过一个简单的例子说明一下
class Person {
private String name;//姓名
private String gender;//性别
...
//省略构造方法和getter、setter方法
...
}
使用Stream的filter进行过滤,只保留男性
Collection collection = new ArrayList();
collection.add(new Person("张三", "男"));
collection.add(new Person("李四", "女"));
collection.add(new Person("王五", "男"));
collection.add(new Person("赵六", "男"));
Stream personStream = collection.stream().filter(new Predicate() {
@Override
public boolean test(Person person) {
return "男".equals(person.getGender());//只保留男性
}
});
collection = personStream.collect(Collectors.toList());//将Stream转化为List
System.out.println(collection.toString());//查看结果
上面的demo没有使用lambda表达式,下面的demo使用lambda来进一步精简代码:
Stream personStream = collection.stream().filter(
person -> "男".equals(person.getGender())//只保留男性
);
效果是一样的
在Java 8以前, 你想通过name获取一个Person通常像这样 :
private static Person getPersonByName(List userList, String name) {
Person result = null;
for (Person temp : userList) {
if (name.equals(temp.getName())) {
result = temp;
}
}
return result;
}
而使用Java 8的新特性后,我们可以使用 stream.filter()来过滤 List,使用 .findAny().orElse (null) 来返回指定的对象.直接上代码
Person result1 = collection.stream() // 转化为流
.filter(x -> "张三".equals(x.getName())) // 只过滤出"张三"
.findAny() // 如果找到了就返回
.orElse(null); // 如果找不到就返回null
System.out.println(result1);
String name = collection.stream()
.filter(x -> "张三".equals(x.getName()))
.map(Person::getName) //把流转化为String
.findAny()
.orElse(null);
map()函数解释: 如果有一个函数可以将一种类型的值转换成另外一种类型,map 操作就可以 使用该函数,将一个流中的值转换成一个新的流。 map 是 Stream 上最常用的操作之一
参考:
Java 8 Stream filter() Example
【Java 8 新特性】Java 8 Stream通过filter()方法筛选数据的示例_猫巳的博客-CSDN博客
Java集合Stream类filter的使用_黄嘉成的博客-CSDN博客
Java8 教程第三章之Stream filter(一) - 简书
【Java 8 新特性】Java 8 Stream通过filter()方法筛选数据的示例_猫巳的博客-CSDN博客