• 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方法
        ...
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用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());//查看结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    上面的demo没有使用lambda表达式,下面的demo使用lambda来进一步精简代码:

    Stream personStream = collection.stream().filter(
            person -> "男".equals(person.getGender())//只保留男性
    );
    
    • 1
    • 2
    • 3

    效果是一样的

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

    在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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    而使用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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    filter()与map()一起使用

    String name = collection.stream()
            .filter(x -> "张三".equals(x.getName()))
            .map(Person::getName)                        //把流转化为String
            .findAny()
            .orElse(null);
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    VR古迹复原——数字化复原圆明园,开创文化遗产保护新方式
    【软件测试】测试老鸟老张,我的梦想是什么?梦想还在吗?
    SpringMVC基础:拦截器
    超市管理系统(java+Mysql)
    Element 2 组件源码剖析之布局容器
    数学知识之约数
    Java前后端分离项目生成二维码链接带中文参数遇到的问题及解决办法
    Java很简单的文件上传(transferTo方式)
    Spring简单例子引入Spring要点
    js变量的声明带var与不带的区别
  • 原文地址:https://blog.csdn.net/Ajekseg/article/details/126080247