Stream filter()过滤有效数据

Posted 爆米花9958

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Stream filter()过滤有效数据相关的知识,希望对你有一定的参考价值。

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<Person> collection = new ArrayList();
collection.add(new Person("张三", "男"));
collection.add(new Person("李四", "女"));
collection.add(new Person("王五", "男"));
collection.add(new Person("赵六", "男"));

Stream<Person> personStream = collection.stream().filter(new Predicate<Person>() 
    @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<Person> personStream = collection.stream().filter(
        person -> "男".equals(person.getGender())//只保留男性
);

效果是一样的

filter()与 findAny() 和 orElse()一起使用

在Java 8以前, 你想通过name获取一个Person通常像这样 :

private static Person getPersonByName(List<Person> 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);

filter()与map()一起使用

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博客

以上是关于Stream filter()过滤有效数据的主要内容,如果未能解决你的问题,请参考以下文章

Stream filter()过滤有效数据

Stream filter()过滤有效数据

java8 stream.filter 过滤集合中的数据

Java8 新特性 Stream 无状态中间操作

Java8使用stream().filter()过滤List对象(查找符合条件的对象集合)

Java 8 数据过滤,removeIf 和 filter 别用错了!!