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

news2024/12/26 9:32:36

一、引言

在上一篇文章中《这么简单,还不会使用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;

/**
 * @date 2022/11/30 22:43
 */
public class Data {
    public static List<Student> initData(){
        List<Student> 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;

/**
 * 测试filter()方法
 * @date 2022/12/1 21:01
 */
public class TestFilter {
    public static void main(String[] args) {
        List<Student> students=Data.initData();
        //使用filter对schoolClass进行过滤,满足条件的返回true,否则返回false,达到过滤的目的
        List<Student> 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;
/**
 * 测试filter()方法
 * @date 2022/12/1 21:01
 */
public class TestFilter {
    public static void main(String[] args) {
        List<Student> students=Data.initData();
        //使用filter对schoolClass进行过滤,满足条件的返回true,否则返回false,达到过滤的目的
        List<Student> 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;

/**
 * 测试filter()方法
 * @date 2022/12/1 21:01
 */
public class TestFilter2 {
    public static void main(String[] args) {
        List<Student> students=Data.initData();
        //使用filter对schoolClass进行过滤,满足条件的返回true,否则返回false,达到过滤的目的
        List<Student> 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的不会放到新流中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

身边的那些信审人员都去哪了?

最近几天看到朋友圈很多信用卡审核中心的老同事&#xff08;老同学&#xff09;在秀到深圳9周年&#xff0c;在2013年的时候&#xff0c;大家都是一起通过校招来到了XX银行信用卡中心的信贷审批部&#xff0c;成为了信用卡人工审核员&#xff0c;那时候入职信贷审批部近百人&am…

这个算法不一般,控制拥塞有一手!

数字时代下&#xff0c;远程办公、线上协同成为刚需&#xff0c;直播带货等业务模式盛行&#xff0c;数据流量爆炸式增长&#xff0c;低时延、高流畅的网络传输诉求给数据中心的处理能力带来了极大挑战。RDMA作为一种新型网络传输技术&#xff0c;可大幅提升网络传输实效&#…

HTML期末学生大作业-节日网页作业html+css+javascript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

详细总结快慢指针的在链表中的常见题型

常见快慢指针题型1.找出链表中间结点2.找到倒数第K个结点3.判断环形链表4.找到环形链表的入口&#xff08;进阶&#xff09;5.相交链表1.找出链表中间结点 双指针进阶解法 1.定义两个指针&#xff0c;一个快指针&#xff0c;一个慢指针。 2.快指着一次走两步&#xff0c;慢指针…

基于冲突搜索的多机器人路径规划(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着自动化物流系统的发展,移动机器人作为运输系统的关键工具,各方面的技术得到了快速的发展。多移动机器人路径规划是机器人导…

什么是单臂路由技术?

使用vlan trunk可以在同一交换机上划分vlan&#xff0c;从而相同vlan的主机可以通信&#xff0c;不同vlan不能通信&#xff0c;如果连接不同vlan的主机想要通信&#xff0c;怎么办&#xff1f; 不同vlan是属于不同广播域的&#xff0c;配置的是不同的IP网段&#xff0c;针对不…

Notepad++官网地址及使用十六进制查看文件的详细教程

目录 一、概述 二、Notepad官网地址 三、Notepad查看十六进制教程  3.1 在线安装HexEditor插件  3.2 手动安装HexEditor插件 一、概述 Notepad是一个开源的源代码编辑器和记事本替代品&#xff0c;支持多种编程语言和自然语言。在MS Windows环境下运行&#xff0c;它的使用受…

在线数据图表制作-FineReport文本控件

1. 概述 1.1 版本 报表服务器版本 App 版本 功能变更 11.0 -- -- 11.0.2 11.0.54 App支持文本控件 NFC 读卡输入 1.2 应用场景 1.2.1 填报控件 填报报表中可以通过该控件输入文本信息&#xff0c;录入填报的数据&#xff0c;如下图所示&#xff1a; 1.2.2 参数控件 …

51单片机APP GSM短信老人跌倒定位温度异常报警检测GPS地图

实践制作DIY- GC0088-跌倒定位温度异常报警 一、功能说明&#xff1a; 基于STM32单片机设计-跌倒定位温度异常报警 功能介绍&#xff1a; STC15W4K48S4&#xff08;或者STM32F103CxT6&#xff09;系列最小系统板OLED显示器SIM800 GSM短信模块1个DS18B20温度测量模块蜂鸣器AD…

我的世界杯 - 诸神黄昏之战

话说长这么大还是头一回主动的去看世界杯比赛... 小时候只是我爷爷他们喜欢看 【CCTV-5】 各种球的比赛&#xff0c;而我我对此毫无兴趣可言&#xff0c;每天只要有时间就沉醉在属于我的 【少儿频道】&#xff0c;喜羊羊、葫芦娃、红猫蓝兔、小娜扎... 而这次可能是因为朋友圈的…

Spring【Bean的作用域与生命周期】

Spring【Bean的作用域与生命周期】&#x1f34e;一.Bean作用域问题&#x1f352;1.1 被修改的 Bean 案例&#x1f352;1.2 原因分析&#x1f34e;二.作⽤域定义&#x1f352;2.1Bean 的 6 种作⽤域&#x1f349; 2.1.1singleton(单例作⽤域)&#x1f349; 2.1.2prototype(原型作…

微服务守护神-Sentinel-概念

引言 书接上篇 微服务应对雪崩的容错方案 &#xff0c;大概知道微服务容错方案可以从隔离、超时、限流、熔断、降级这几方面入手。好了&#xff0c;理论了解了&#xff0c;那代码落地方案&#xff1f;这是后本篇的主角要登陆场&#xff1a;Sentinel&#xff0c;微服务的守护神…

Xylan-MAL|木聚糖-马来酰亚胺|木聚糖-聚乙二醇-马来酰亚胺|马来酰亚胺-PEG-木聚糖

Xylan-MAL|木聚糖-马来酰亚胺|木聚糖-聚乙二醇-马来酰亚胺|马来酰亚胺-PEG-木聚糖 中文名称&#xff1a;木聚糖-马来酰亚胺 英文名称&#xff1a;Xylan-MAL 别称&#xff1a;马来酰亚胺修饰木聚糖&#xff0c;马来酰亚胺-木聚糖 存储条件&#xff1a;-20C&#xff0c;避光&…

编程初学者应该先学C++、Java还是Python?

语言推荐&#xff1a; 第一大类语言包括Java、C、Python和C. 这类语言都是非常通用的语言,它们并不局限于特定的编程平台或用途。(无疑问&#xff0c;你应该熟悉这四种语言。) 第二大类语言包括Java、C#、PHP和Swift。 Java 和PHP是主要的Web开发语言。C# 是微软的编程语言&…

总结《你不知道的JavaScript》三卷小记

先讲一些废话 三本小黄书&#xff0c;工作日都抽出半小时来看看&#xff0c;三本书加来一共700多页的样子。我拖拖延延看了三个月&#xff0c;终于看完了。然后现在抽出时间随便写点&#xff0c;我只是挑一些自己想总结的&#xff0c;给自己一个名词概念&#xff0c;好了废话就…

FreeRTOS移植

FreeRTOS移植一、获取FreeRTOS源码1.1 官网下载1.2 源码路径二、移植2.1 工程内新建分支2.2 分支内添加文件FreeRTOS_COREFreeRTOS_PORTABLE添加完成2.3 添加 FreeRTOSConfig.h 文件2.4 添加 FreeRTOS 头文件路径三、举例3.1 包含头文件3.2 创建任务四、FreeRTOSConfig.h 附录一…

Redis——(7)redis作为mybatis缓存整合二级缓存的整合

1.作为mybits的缓存整合 1&#xff09;用户第一次访问的时候获取数据库的值&#xff0c;再次访问时直接从缓存中获取数据 2&#xff09;设置缓存过期时间 3)项目8080端口是对外端口&#xff08;向外部暴露的端口&#xff09;&#xff0c;区别于内部进程号,查内部端口用ps -ef|…

分布式环境下Spring Session Redis底层原理

1 自动装配 public class SessionAutoConfiguration {// SessionRepositoryFilterConfiguration用来配置核心的过滤器// 3 核心过滤器Configuration(proxyBeanMethods false)ConditionalOnWebApplication(type Type.SERVLET)Import({ ServletSessionRepositoryValidator.clas…

什么是代码签名证书?

使用代码签名证书&#xff0c;您可以保证签名者的身份和软件的完整性&#xff0c;这可以防止在下载和安装软件时出现警告。 代码签名证书是软件开发人员用来签署其软件、应用程序和驱动程序代码的数字证书。它使用公私密钥基础设施(PKI)将实体绑定到公钥和私钥。 申请代码签名…

SuperKnob超级旋钮

SuperKnob超级旋钮 2022年12月5日&#xff0c;今天总结下几个月前搞得小项目&#xff0c;好久没有写文总结了&#xff0c;有多少人不再写博客了呢&#xff1f;转眼疫情已三年&#xff0c;生活节奏太快了&#xff0c;认识的很多大佬他们的博客也不再更新了&#xff0c;都在努力…