Java8之Stream操作

news2024/12/28 19:00:26

Java8之Stream操作

  • stream干啥用的?
  • 创建流
  • 中间操作
  • 终结操作
  • 好文推荐----接口优化思想

stream干啥用的?

Stream 就是操作数据用的。使用起来很方便
创建流 → 中间操作 → 终结操作

在这里插入图片描述

Stream的操作可以分为两大类:中间操作、终结操作

中间操作可分为:

  1. 无状态(Stateless)操作:指元素的处理不受之前元素的影响
  2. 有状态(Stateful)操作:指该操作只有拿到所有元素之后才能继续下去

终结操作可分为:

  1. 短路(Short-circuiting)操作:指遇到某些符合条件的元素就可以得到最终结果
  2. 非短路(Unshort-circuiting)操作:指必须处理完所有元素才能得到最终结果

创建流

  1. 单列集合
    通过 .stream() 方法即可。
   // 例如:
   List<Person> personList = new ArrayList<>();
   // 创建流
   Stream pstream = personList.stream();
  1. 双列集合
    转成单列集合再创建流
	//例如:
    Map<String,Integer> map = new HashMap<>();
    map.entrySet()  //转成与List一样的单列集合,只是取值不一样。
       .stream()  

中间操作

  1. filter 过滤
		List<Person> personList = new ArrayList<>();
        personList.add(new Person(10,"flx"));
        personList.add(new Person(11,"flx"));
        personList.add(new Person(12,"cxy"));
        personList.add(new Person(13,"cxy"));
        personList.add(new Person(10,"flx"));


        //filter操作----过滤。比如过滤出年龄大于10的人。
        personList.stream()
                  .filter(person -> person.age>10)
                  .forEach(person -> System.out.println(person.getName()));
  1. map 对整体流的操作
        //最常用的操作是取某一些值
        personList.stream()
                .map(person -> person.getName())
                .forEach(name -> System.out.println(name));
                
        // 计算的话,一般用不到
        personList.stream()
                  .map(person -> person.age = person.age+10)
                  .forEach(person -> System.out.println(person));
  1. flatMap 扁平化List。重点是扁平化对象中有List的数据,且要返回流数据
        Friend friend1 = new Friend("张三");
        Friend friend2 = new Friend("李四");
        Friend friend3 = new Friend("王五");
        List<Friend> friends = new ArrayList<>();
        friends.add(friend1);
        friends.add(friend2);
        friends.add(friend3);

        List<Person> personList2 = new ArrayList<>();
        personList2.add(new Person(10,"flx",friends));
        personList2.add(new Person(11,"cxy",friends));

        personList2.stream()
                   .flatMap(person -> person.getFriendList().stream())
                   .forEach(friend -> System.out.println(friend.getName()));
  1. distinct 去重。重点是需要重写对象中equals()方法
        // distinct操作----去重。
        personList.stream()
                  .distinct()
                  .forEach(person -> System.out.println(person.getName()));
  1. sorted 排序。重点是对象需要实现Comparable接口
        // sorted操作----排序。
        personList.stream()
                  .sorted()
                  .forEach(person -> System.out.println(person.getAge()));
  1. limitskip。limit是截取前n个元素。skip是跳过前n个,剩下的截取
        // limit操作----截取。
        personList.stream()
                  .limit(2)
                  .forEach(person -> System.out.println(person.getAge()));



        // skip操作----跳过并截取
        personList.stream()
                .skip(2)
                .forEach(person -> System.out.println(person.getAge()));

终结操作

  1. collect 转成集合
  2. forEach 遍历
  3. countmaxmin 统计、最大、最小
        long count = personList.stream()
                .flatMap(person -> person.getFriendList().stream())
                .count();
        System.out.println(count);


        Optional<Integer> max = personList.stream()
                .map(person -> person.getAge())
                .max((o1,o2) -> o1-o2);
        System.out.println(max.get());
  1. anyMatchallMatch
        // anyMatch 只要有一个匹配,就返回true
        // allMatch 所有都匹配,才返回true
                Boolean b = personList.stream()
                  .anyMatch(person -> person.getAge()>10);
        System.out.println(b);

  1. findAnyfindFirst
        // findAny 查找任意一个满足条件的元素
        // findFirst 查找满足条件元素的第一个
        Optional<Person> first = personList.stream()
                .filter(person -> person.getAge() > 10)
                .findFirst();

        first.ifPresent(person -> System.out.println(person.getName()));
  1. reduce 一般会先map一下,再执行reduce ( 我们熟悉的mapReduce()操作 )
        // reduce(params1,params2)
        // params1:初始化的第一个值
        // params2: 要执行的操作。
            // 里面有两个参数  result、element
            // result 每一步返回的结果
            // element 当前的元素


        // 例如,计算所有的年龄的和
        Integer reduce = personList.stream()
                .map(person -> person.getAge())
                .reduce(0, (result, element) -> result = result + element);
        System.out.println(reduce);

中间操作常用的是 filter、map、flatmap
终结操作常用的是foreach、collect、reduce

整体代码示例

package com.face;

import lombok.val;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@SpringBootTest
class FaceEasyApplicationTests {

    @Test
    void contextLoads() {
    }

    /*
    * 中间操作
    * */
    @Test
    void testStreamMiddle() {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(10,"flx"));
        personList.add(new Person(11,"flx"));
        personList.add(new Person(12,"cxy"));
        personList.add(new Person(13,"cxy"));
        personList.add(new Person(10,"flx"));


        //filter操作----过滤。比如过滤出年龄大于10的人。
        personList.stream()
                  .filter(person -> person.age>10)
                  .forEach(person -> System.out.println(person.getName()));



        //map操作----对整体流中数据的计算或者转换。比如给所有作家+10岁
        //常用的操作是取某一些值
        personList.stream()
                .map(person -> person.getName())
                .forEach(name -> System.out.println(name));
        // 计算的话,一般用不到
        personList.stream()
                  .map(person -> person.age = person.age+10)
                  .forEach(person -> System.out.println(person));



        // distinct操作----去重。重点是重写equals方法。
        personList.stream()
                  .distinct()
                  .forEach(person -> System.out.println(person.getName()));




        // sorted操作----排序。
        personList.stream()
                  .sorted()
                  .forEach(person -> System.out.println(person.getAge()));



        // limit操作----截取。例如截取前两个。可以结合排序使用,比如排序后,截取元素
        personList.stream()
                  .limit(2)
                  .forEach(person -> System.out.println(person.getAge()));



        // skip操作----跳过。跳过前n个元素,返回剩下的。可以结合排序使用,比如排序后,跳过某些元素,返回剩下的
        personList.stream()
                .skip(2)
                .forEach(person -> System.out.println(person.getAge()));



        // flatMap操作----扁平化处理。扁平化对象中的List,并且把她们作为流返回
        Friend friend1 = new Friend("张三");
        Friend friend2 = new Friend("李四");
        Friend friend3 = new Friend("王五");
        List<Friend> friends = new ArrayList<>();
        friends.add(friend1);
        friends.add(friend2);
        friends.add(friend3);

        List<Person> personList2 = new ArrayList<>();
        personList2.add(new Person(10,"flx",friends));
        personList2.add(new Person(11,"cxy",friends));

        personList2.stream()
                   .flatMap(person -> person.getFriendList().stream())
                   .forEach(friend -> System.out.println(friend.getName()));

    }




    /*
    * 终结操作
    * */
    @Test
    void testStreamFinish() {
        Friend friend1 = new Friend("张三");
        Friend friend2 = new Friend("李四");
        Friend friend3 = new Friend("王五");
        List<Friend> friends = new ArrayList<>();
        friends.add(friend1);
        friends.add(friend2);
        friends.add(friend3);

        List<Person> personList = new ArrayList<>();
        personList.add(new Person(10,"flx",friends));
        personList.add(new Person(11,"cxy",friends));

        // forEach
        personList.stream()
                  .map(person -> person.getName())
                  .forEach(name -> System.out.println(name));


        // count操作----统计数量。例如统计personList中,所有朋友的数量
        long count = personList.stream()
                .flatMap(person -> person.getFriendList().stream())
                .count();
        System.out.println(count);


        // max和min操作----取最大值与最小值。例如取personList中年龄的最大值与最小值
        Optional<Integer> max = personList.stream()
                .map(person -> person.getAge())
                .max((o1,o2) -> o1-o2);
        System.out.println(max.get());


        // collect操作----转换成集合。


        // anyMatch 、allMatch 、findAny、findFirst操作----见名知意,就是匹配操作与查找操作
        // anyMatch 只要有一个匹配,就返回true
        // allMatch 所有都匹配,才返回true

        // findAny 查找任意一个满足条件的元素
        // findFirst 查找满足条件元素的第一个
        Boolean b = personList.stream()
                  .anyMatch(person -> person.getAge()>10);
        System.out.println(b);


        // 查找年龄大于10的第一个元素
        Optional<Person> first = personList.stream()
                .filter(person -> person.getAge() > 10)
                .findFirst();

        first.ifPresent(person -> System.out.println(person.getName()));



        //reduce操作----归并。一般会先map一下,再执行reduce ( 我们熟悉的mapReduce()操作 )
        // reduce(params1,params2)
        // params1:初始化的第一个值
        // params2: 要执行的操作。
            // 里面有两个参数  result、element
            // result 每一步返回的结果
            // element 当前的元素


        // 例如,计算所有的年龄的和
        Integer reduce = personList.stream()
                .map(person -> person.getAge())
                .reduce(0, (result, element) -> result = result + element);
        System.out.println(reduce);




    }

}


class Person implements Comparable<Person>{

    public int age;
    public String name;
    List<Friend> friendList;



    public List<Friend> getFriendList() {
        return friendList;
    }

    public void setFriendList(List<Friend> friendList) {
        this.friendList = friendList;
    }


    public Person(int age, String name, List<Friend> friendList) {
        this.age = age;
        this.name = name;
        this.friendList = friendList;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }

    @Override
    public int hashCode() {
        int result = age;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }


    @Override
    public int compareTo(Person person) {
        return this.getAge() - person.getAge();
    }
}

class Friend{

    public String getName() {
        return name;
    }

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

    public Friend(String name) {
        this.name = name;
    }

    String name;

}

好文推荐----接口优化思想

https://mp.weixin.qq.com/s/oeHLLvmKuq3zOQcRhSs8gw

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【项目源码】采用UWB技术开发的定位系统源码,室内定位系统源码

UWB技术定位系统源码&#xff0c;高精度人员定位系统源码&#xff0c;智慧工厂人员定位系统源码&#xff0c;室内定位系统源码 技术架构&#xff1a;单体服务 硬件&#xff08;UWB定位基站、卡牌&#xff09; 开发语言&#xff1a;java 开发工具&#xff1a;idea 、VS Code…

字节小组长薪资被应届生员工倒挂7K,不把老员工当人?

一位字节跳动的小管理爆出&#xff0c;无意中看到了整个部门薪资&#xff0c;本以为自己算比较高的&#xff0c;但看完之后整个人都傻眼了。小组长的职位月薪28K&#xff0c;而手下组员却是35K&#xff0c;当天晚上抽了一包烟也没想明白是为什么。 楼主表示&#xff0c;自己是字…

基于java的闲置物品交易系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题&#xff0c;今天给…

YOLOv5改进系列(4)——添加ECA注意力机制

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2)——添加CBAM注意力机制

T265录制的rosbag拆包:拆IMU序列和图像序列方法以及如何制作双目euroc、双目tum数据集

目录 1.录制bag包 2.左右目图像的拆解 3.拆IMU数据 4.如何制作eruoc与tum数据集 4.1 eruoc数据集格式 4.2 对齐时间戳 4.3 编写imu.csv文件 4.4 生成索引文件 4.一个脚本完成拆包 1.录制bag包 这里推荐我的同学的博客&#xff0c;大家可以参考这篇博客录制T265的ros包并…

移动互联网市场是不需要Android 开发了吗?

就近有不少朋友在吐槽&#xff1a;如今Android工作真的难找&#xff01;从年初找到了现在&#xff0c;是市场不需要Android 开发人才了&#xff0c;人都迷茫了&#xff0c;是不是应该考虑转行了&#xff1f; 其实这种情况往年也是有的&#xff0c;但是今年显得的更严重一些。我…

【el-select】多选的简单用法

即使element用了很久&#xff0c;还是会有新的东西没用过 el-select的多选和日期组件有范围的el-date-picker很相似&#xff0c;都是绑定数组&#xff0c;然后给需要的字段再赋值 加上multiple属性即可&#xff0c;collapse-tags看自己需不需要 这个时候v-model绑定的是数组 …

【C++初阶】C++模版(初阶)

文章目录 前言泛型编程函数模版函数模板概念函数模板格式函数模板的原理函数模板的实例化1.隐式实例化2.显式实例化 函数模版的匹配规则 类模版类模板的定义格式类模板的实例化 总结 前言 C的模版也是相较于C语言更有优势的地方&#xff0c;正是有了模版&#xff0c;才让C真正…

vue-admin-template 后台模版初始化及问题汇总

参考&#xff1a;https://segmentfault.com/a/1190000023185109?sortvotes 问题一&#xff1a;Unsupported engine 后来经过分析&#xff0c;发现&#xff0c;element-ui 的版本依赖锁定是在一个叫做package-locak.json 中&#xff0c;并且找到了相关配置。 package-lock.js…

C语言文件:数据文件a.txt中保存了若干个学生的学号、姓名和成绩。请编程读出显示文件内容并分类统计各等级人数,最后显示统计结果。

一、作者想先说一点废话&#xff08;狗头表情&#xff09; 想必经常看我博客的小伙伴们已经发现我最近的博客风格和以往有些不同。以往的博客都是“一本正经不敢胡来”&#xff0c;但近段时间&#xff0c;文章风格却变得“废话连篇放荡不羁”&#xff0c;究竟是为什么呢&#…

像素画板-第14届蓝桥杯省赛Scratch初级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第133讲。 像素画板&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程初级组真题第4题&#xf…

基于VCSEL红外激光,柔性AR隐形眼镜方案诞生

研发AR隐形眼镜有多难&#xff1f;从备受关注的Mojo Vision来看&#xff0c;这家公司成立了8年时间&#xff0c;累计融资超过2.26亿美元&#xff0c;但由于产品进展和融资受阻问题&#xff0c;不得不大幅裁员、重组&#xff0c;将重心从AR隐形眼镜转移到Micro LED显示业务。 为…

生态、遥感、大气、水文水资源、地下水土壤、人工智能等多领域教程

理论讲解案例实战动手实操讨论互动 针对 生态农林、遥感、语言土壤、统计、人工智能等领域全套教程。包含:InVEST模型、DSSAT模型、CENTURY模型、CASA模型、SWH蒸散模型、BGC模型、MAXENT模型、CLM模式、CLUE模型、PROSAIL模型、Biomod模型、Hydrus模型、Meta分析、ArcGIS、MAT…

黑马点评Redis实战(优惠卷秒杀)

本文是上一篇文章的后续&#xff0c;上一篇文章链接 马点评Redis实战(短信登录;商户查询缓存) 锁 一、优惠卷秒杀 id是一个订单必备的属性&#xff0c;而订单的id属性是必须唯一的&#xff0c;首先我们会想到使用数据库主键id&#xff0c;并设置为自增。这样似乎就能满足唯…

tracker_query_storage fail, error no: 28, error info: No space left on device

先说结论&#xff1a; 这个错误信息提示磁盘空间不足&#xff0c;导致tracker查询存储失败。错误代码28表示系统中没有足够的可用空间。这个问题的解决方法是清理磁盘空间&#xff0c;释放足够的存储空间。 [rootlocalhost fdfs]# fdfs_test /etc/fdfs/client.conf upload /h…

DNS域名解析,以及A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR说明

温故知新&#xff0c;最近网上开到相关文章&#xff0c;这里终结记录一下&#xff0c;供大家参考。 目录 1.A记录 2、CNAME&#xff1a; 两种域名解析方式 4、NS记录 5、TXT记录&#xff1a; 6、AAAA记录&#xff1a; 7、SRV记录&#xff1a; 8、SOA记录&#xff1a; …

MySQL基础(三十)PowerDesigner的使用

1 PowerDesigner的使用 PowerDesigner是一款开发人员常用的数据库建模工具&#xff0c;用户利用该软件可以方便地制作 数据流程图 、概念数据模型 、 物理数据模型&#xff0c;它几乎包括了数据库模型设计的全过程&#xff0c;是Sybase公司为企业建模和设计提供的一套完整的集…

统计学方法选择

统计学方法选择 参考资料什么是参数检验 参考资料 【如何选择统计学方法&#xff1f;T检验、单因素方差分析、秩和检验、卡方检验到底应该选择哪一个&#xff1f;一个视频轻松搞定】 https://www.bilibili.com/video/BV18X4y1k7GB/?share_sourcecopy_web&vd_sourced51021…

极智项目 | 实战OpenCV手势识别

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文带来一个实战项目 OpenCV手势识别&#xff0c;并提供完整项目工程源码。 本文介绍的实战OpenCV手势识别&#xff0c;提供完整的可以一键执行的项目工程源码&a…

Makefile基础教学(预定义变量)

文章目录 前言一、自动变量的概念二、自动变量在工程中的应用三、特殊变量的使用四、特殊变量在工程中的应用总结 前言 上篇文章讲解到了变量的使用&#xff0c;这篇文章继续讲解预定义变量。 一、自动变量的概念 在Makefile中&#xff0c;自动变量指的是可以在编写规则或命…