java8特性:Stream高效操作数组集合

2023-11-18

简介

Stream 作为 java8 的新特性,基于 lambda 表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合操作或者大批量的数据操作,提高了编程效率和代码可读性。

Stream 的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选、去重、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。
集合有两种方式生成流:
在这里插入图片描述
上图中是 Stream 类的类结构图,里面包含了大部分的中间和终止操作。

举例说明

首先为了说明 Stream 对对象集合的操作,新建一个 Student 类(学生类), 覆写了 equals() 和 hashCode() 方法

public class Student1{

    private Long id;
    private String name;
    private int age;
    private String address;

    
   public Student1(){}

  public Student1(Long id,String name,int age,String address)
 {
        this.id =id;
        this.name =name;
        this.age =age;
        this.address =address;
    }

    
	@Override
   public String toString() {
        return "Student1{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(id, student.id) &&
                Objects.equals(name, student.name) &&
                Objects.equals(address, student.address);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, address);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

filter(筛选)

public class StreamDemo {
    public static void main(String[] args) {
        Student1 s1 = new Student1(1L, "张三", 15, "浙江");
        Student1 s2 = new Student1(2L, "李四", 15, "湖北");
        Student1 s3 = new Student1(3L, "王五", 17, "北京");
        Student1 s4 = new Student1(4L, "赵六", 17, "浙江");
        List<Student1> student1s = new ArrayList<>();
        student1s.add(s1);
        student1s.add(s2);
        student1s.add(s3);
        student1s.add(s4);

        List<Student1> streamStudents = testFilter(student1s);
        streamStudents.forEach(System.out::println);

    }
    private static List<Student1>testFilter(List<Student1>student1s){
        //筛选年龄大于15岁的学生
//        return student1s.stream().filter(s->s.getAge()>15).collect(Collectors.toList());
//        //筛选住在浙江的学生
        return student1s.stream().filter(s->"浙江".equals(s.getAddress())).collect(Collectors.toList());
    }

运行结果:
在这里插入图片描述
这里我们创建了四个学生,经过 filter 的筛选,筛选出地址是浙江的学生集合。

map(转换)

  public static void main(String[] args) {
        Student1 s1 = new Student1(1L, "张三", 15, "浙江");
        Student1 s2 = new Student1(2L, "李四", 15, "湖北");
        Student1 s3 = new Student1(3L, "王五", 17, "北京");
        Student1 s4 = new Student1(4L, "赵六", 17, "浙江");
        List<Student1> student1s = new ArrayList<>();
        student1s.add(s1);
        student1s.add(s2);
        student1s.add(s3);
        student1s.add(s4);
        
        testMap(student1s);
    }
    private static void testMap(List<Student1>student1s){
        //地址前面加上部分.信息,只获取地址输出
        List<String> addresses = student1s.stream().map(s -> "地址:" + s.getAddress()).collect(Collectors.toList());
        addresses.forEach(a-> System.out.println(a));
    }

运行结果:
在这里插入图片描述
map 就是将对应的元素按照给定的方法进行转换。

distinct(去重)

在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
可以看出,两个重复的 “李四”和“赵六” 同学进行了去重,这不仅因为使用了 distinct()方法,而且因为 Student 对象重写了 equals 和 hashCode()方法,否则去重是无效的。

sorted(排序)

在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
上面指定排序规则,先按照学生的 id 进行降序排序,再按照年龄进行降序排序

limit(限制返回个数)

在这里插入图片描述
运行结果:
在这里插入图片描述

skip(删除元素)

在这里插入图片描述
运行结果:
在这里插入图片描述

min(求最小值)

在这里插入图片描述
运行结果:
在这里插入图片描述
上面是求所有学生中年龄最小的一个,max 同理,求最大值。

总结

上面介绍了 Stream 常用的一些方法,虽然对集合的遍历和操作可以用以前常规的方式,但是当业务逻辑复杂的时候,你会发现代码量很多,可读性很差,明明一行代码解决的事情,你却写了好几行。试试 lambda 表达式,试试 Stream,你会有不一样的体验。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8特性:Stream高效操作数组集合 的相关文章

随机推荐

  • depcheck检测缺失哪些依赖包

    npm install g depcheck 如果不想全局安装 npm i depcheck后可以在package json的scripts中输入 check depcheck 之后使用 npm run check depcheck npm
  • umi-request 网络请求之路

    umi request 网络请求之路 背景 在做中台业务应用开发的过程中 我们发现在请求链路上存在以下问题 请求库各式各样 没有统一 每次新起应用都需要重复实现一套请求层逻辑 切换应用时需要重新学习请求库 API 各应用接口设计不一致 混乱
  • sql注入Less11-20

    Less 11 POST 1 先登录 在表格中输入admin admin 登录成功后为下图 2 在post data中输入以下 uname passwd 1 submit submit 返回的结果显示存在sql语法错误 证明存在注入漏洞 u
  • 修改别人代码的原则

    工作过程中难免会涉及到修改或维护别人写的代码 如 代码原作者请假 离职 或相关的bug落到了你的头上 或用别人写的通用方法不爽时 如果碰到修改别人的代码时 需要注意哪些事项呢 1 和原作者沟通 当用到了他人写的通用方法 又感觉不爽时 如果原
  • 各个版本chrome允许加载使用flash的方法

    根除办法 在html中嵌入标签 用户自动选择是否加载flash 69 0 之前的版本 1 打开 chrome settings content flash 2 禁止网站运行Flash gt 改为 Ask Default 3 允许 gt 添加
  • golang开发的准备 - gvm(go版本管理软件)的安装

    0 系统环境 ubuntu18 04 1 前置条件 sudo apt get install bison 2 安装步骤 1 从github下载安装包文件 git clone https github com moovweb gvm git
  • 【c++】14.编译proto和proto相关用法

    编译proto和proto相关用法 关于proto相关的知识可以参考系列博客 https blog csdn net daaikuaichuan category 9869251 html xx proto文件中如果要注释的话 注释符号也是
  • 【Kaggle】Stable Diffusion - Image to Prompts竞赛代码初步理解

    文章目录 一 前言 二 导包 三 加载预训练的 OFA 模型 四 模型EDA 五 Inference 六 安装并导入所有依赖项 七 设置配置 八 加载示例提交 九 Build index from images 十 CLIP interro
  • grep命令

    grep 全称是global regular expressions print 功能就是查找匹配模式的行 grep对文本内容的处理是以行为单位 输出也是输出匹配的行 也可以使用两个变种程序egrep和fgrep egrep与grep E相
  • linux下绑定任务到特定的CPU

    一 linux c查看cpu核 1 命令行查看cpu有几个核 cat proc cpuinfo grep processor wc l 或 nproc 2 linux c代码查看 include
  • 一文了解全面静态代码分析

    在开发具有安全性 可靠性和合规性的软件时 全面静态代码分析是一种有效的方法 在这里 我们将就静态分析而言 讨论全面静态代码分析的不同之处 阐述全面静态代码分析的重要性 以及如何进行全面静态代码分析 什么是全面静态代码分析 全面静态代码分析
  • 计算机行业应届生秋招春招究竟拼的是什么?

    计算机行业是被行外人神话的行业 也是被行内人吐槽的行业 2020年中国高校IT行业毕业生达到了将近70万人 这是什么概念 这样的情况下应届生的顺利就业将会是很大的问题 也就是说几十计算机行业的人才需求很大 也将面临着很大一部分毕业生找不到工
  • iOS系统语音识别

    iOS10语音识别框架Speech 项目中用到语音识别功能 这里简单的进行了一下封装 大概实现了系统语音识别的功能 还没测试 应该会有很多坑 语音识别功能封装 系统的语音识别 外部语音输入 实现语音转文字功能 项目地址 https gith
  • Tello无人机飞控(Python)程序设计

    Tello无人机飞控 Python 程序设计总结 1 py飞控库介绍 tello的几个不同的飞控库有什么区别吗 用哪个好些 Tello的几个不同飞控库主要是针对Python开发者提供的控制无人机的工具包 它们各有特点和使用方式 以下是对一些
  • 闪回版本查询+闪回版本查询案例1+闪回版本查询案例2

    闪回版本查询 闪回版本查询提供了一个审计 检查行改变的查询功能 通过它可以查找到 所有已经提交了的行记录 语法 select column name column name from table name versions between
  • 5G智慧交通白皮书 附下载地址

    智慧交通是人民对美好生活的向往之一 智慧交通从安全 效率 节能等方面改善人民的出行体验 无人驾驶的发展和普及进一步改变人们的生活方式 智慧交通业务丰富 面对不同的应用场景 需要专属的解决方案 网络联接 实时通信是智慧交通的基础 5G 赋能智
  • 围棋:一间低夹

    一间低夹 搜索结果 哔哩哔哩 Bilibili 1 复杂的新版一间高夹 第一集 复杂的新版一间高夹 第一集 哔哩哔哩 bilibili 2 复杂的新版一间高夹 第二集 复杂的新版一间高夹 第二集 哔哩哔哩 bilibili 3 复杂的新版一
  • java的六大框架_常用的java开发框架介绍 (初学者必备的六大框架)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 常用的java开发框架java作为主流的开发语言之一其框架的使用也是非常广泛的 java到javaee部分全部是在以框架来开发 因为框架可以大大节约时间以及成本 那么java中常用的主流框架都有
  • Freetype编译

    编译freetype步骤 1 解压包freetype 2 10 0 tar 2 cd freetype 2 10 0 3 cd builds unix 4 chmod 777 configure 创建一个文件夹 media private
  • java8特性:Stream高效操作数组集合

    简介 Stream 作为 java8 的新特性 基于 lambda 表达式 是对集合对象功能的增强 它专注于对集合对象进行各种高效 便利的聚合操作或者大批量的数据操作 提高了编程效率和代码可读性 Stream 的原理 将要处理的元素看做一种