我的编程空间,编程开发者的网络收藏夹
学习永远不晚

总算给女盆友讲明白了,如何使用stream流的filter()操作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

总算给女盆友讲明白了,如何使用stream流的filter()操作

一、引言

在上一篇文章中《这么简单,还不会使用java8 stream流的map()方法吗?》分享了使用stream的map()方法,不知道小伙伴还有印象吗,先来回顾下要点,map()方法是把一个流中的元素T转换为另外一个新流中的元素R,转换完成后两个流的元素个数不发生改变,具体怎么使用,请小伙伴移步上篇查看。在上篇文章中遗留了一个问题,本篇文章来解决它。先来看stream的另一个API--filter()方法。

二、概述

先来看下filter方法的定义,

该方法返回一个新流,这个新流中的元素要匹配给定的表达式。从方法的入参及出参可以看到返回的新流中的元素和元素流中的元素类型是一致的,和map()方法不同的是新流的元素个数要小于等于原始流的元素个数。

下面看下示意图,更清晰,

是不是很简单,下面看下具体的用法。

三、详述

以”找出一年级的所有学生的成绩“为例,来看下怎么使用filter()方法。同样初始化五个学生,

Data.java

package com.example.log.stream.test;import com.example.log.stream.entity.Student;import java.util.ArrayList;import java.util.List;public class Data {    public static List initData(){        List students= new ArrayList<>();        Student s1=new Student();        s1.setName("王五");        s1.setSchoolClass("一年级");        s1.setChineseScore(100);        s1.setMathScore(100);        students.add(s1);        Student s2=new Student();        s2.setName("李四");        s2.setSchoolClass("一年级");        s2.setChineseScore(100);        s2.setMathScore(100);        students.add(s2);        Student s3=new Student();        s3.setName("李思");        s3.setSchoolClass("二年级");        s3.setChineseScore(100);        s3.setMathScore(100);        students.add(s3);        Student s4=new Student();        s4.setName("王五");        s4.setSchoolClass("三年级");        s4.setChineseScore(100);        s4.setMathScore(100);        students.add(s4);        Student s5=new Student();        s5.setName("赵三");        s5.setSchoolClass("一年级");        s5.setChineseScore(100);        s5.setMathScore(100);        students.add(s5);        return students;    }}

Student.java类这里不在贴出,有兴趣的可以自己写,或参考上篇文章中的定义。直接看怎么实现。

3.1、找出一年级的所有学生成绩

要找出一年级的所有学生成绩,就要根据schoolClass进行过滤,看下使用filter()方法怎么写。

package com.example.log.stream.test;import com.example.log.stream.entity.Student;import java.util.List;import java.util.stream.Collectors;public class TestFilter {    public static void main(String[] args) {        List students=Data.initData();        //使用filter对schoolClass进行过滤,满足条件的返回true,否则返回false,达到过滤的目的        List firstClass=students.stream().filter(student -> {            if("一年级".equals(student.getSchoolClass())){                return true;            }            return false;        }).collect(Collectors.toList());        //打印新的流        for (Student student:firstClass) {            System.out.println(student);        }        System.out.println("---------------------");        for (Student student:students) {            System.out.println(student);        }    }}

使用filter()方法,该方法中的函数式接口,返回一个boolean类型的值,从而决定了该元素是否会写入到新流中。看下结果,

如果现在有这样一个需求,找出所有的一年级的学生,并给他们的数学成绩都减1分。要怎么办?

3.2、给一年级的所有同学的数学成绩减1分

我们可以在上面的基础上进行修改,完成此需求,

package com.example.log.stream.test;import com.example.log.stream.entity.Student;import java.util.List;import java.util.stream.Collectors;public class TestFilter {    public static void main(String[] args) {        List students=Data.initData();        //使用filter对schoolClass进行过滤,满足条件的返回true,否则返回false,达到过滤的目的        List firstClass=students.stream().filter(student -> {            if("一年级".equals(student.getSchoolClass())){                //所有一年级的学生,数学减1分                student.setMathScore(student.getMathScore()-1);                return true;            }            return false;        }).collect(Collectors.toList());        //打印新的流        for (Student student:firstClass) {            System.out.println(student);        }        System.out.println("---------------------");        for (Student student:students) {            System.out.println(student);        }    }}

只需在上面的基础上增加一行代码即可,即符合条件的都减1分,看下打印结果。

从上面的解雇可以看到使用filter完成了该功能,但带来的一个副作用是原始数据也变了,主要是因为修改的是通过一个引用指向的对象。其实不太建议这样去写,因为filter()方法从字面意思就可以知道,它的作用就是过滤,最好不要参杂其他的逻辑,可以再加一个map()方法。

TestFilter2.java

package com.example.log.stream.test;import com.example.log.stream.entity.Student;import java.util.List;import java.util.stream.Collectors;public class TestFilter2 {    public static void main(String[] args) {        List students=Data.initData();        //使用filter对schoolClass进行过滤,满足条件的返回true,否则返回false,达到过滤的目的        List firstClass=students.stream().filter(student -> {            if("一年级".equals(student.getSchoolClass())){                return true;            }            return false;        }).map(student -> {//map()方法            //设置数学成绩减1            student.setMathScore(student.getMathScore()-1);            return student;        }).collect(Collectors.toList());        //打印新的流        for (Student student:firstClass) {            System.out.println(student);        }        System.out.println("---------------------");        for (Student student:students) {            System.out.println(student);        }    }}

上面在使用完filter后,由于是一个stream流,那么继续使用map()方法,对上一步过滤出的元素再对数学成绩减1操作,最后得到结果。通过一个示意图,

这样是不是比直接在fliter()中更加清晰。

四、总结

stream的filter()方法是要通过true/false来筛选元素,为true的会放到新流中,反之为false的不会放到新流中。

来源地址:https://blog.csdn.net/Candyz7/article/details/128181384

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

总算给女盆友讲明白了,如何使用stream流的filter()操作

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录