补知识点:Stream API

news2024/9/21 16:20:07

 一、创建Stream

        首先创建Stream的话,有四种创建方式:

 注: 第一种集合的方式是最常用的

package com.atguigu.gulimall.gateway;


import com.atguigu.gulimall.streamapi.Employee;
import com.atguigu.gulimall.streamapi.EmployeeData;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

@SpringBootTest
class GulimallGatewayApplicationTests {

    /**
     *  第一种创建Stream的方式: 通过集合,调用stream方法,返回的是一个顺序流
     *
     *      返回的是一个顺序流 : 也就是说使用stream流遍历集合中的数据的时候,遍历出来时就是按照添加到集合中的
     *                          那个数据顺序遍历出来的
     */
    @Test
    void Test1(){
        List<Employee> list = EmployeeData.getEmployees();  // 通过调用刚才那个类 就拿到刚才那个List集合了
        Stream<Employee> stream = list.stream(); // 集合通过调用stream方法就创建出Stream了
    }

    /**
     *  第一种创建Stream的方式: 也是通过集合
     *  不过调用的不再是stream方法,而是 parallelStream方法,返回的是一个并行流
     *
     *      返回的是一个并行流: 也就是说遍历出来集合中的数据的时候,不是按照顺序遍历出来的,而是相当于线程,各跑各的
     *                          因此遍历出来的集合中的数据是没有顺序的
     */
    @Test
    void Test2(){
        List<Employee> list = EmployeeData.getEmployees();  // 通过调用刚才那个类 就拿到刚才那个List集合了
        Stream<Employee> stream = list.parallelStream(); // 集合通过调用stream方法就创建出Stream了
    }

    /**
     *  第二种方式: 通过数组
     *
     *      直接用 Arrays.stream调用数组即可
     */
    @Test
    void Test3(){
        int[] arr =new int[]{1,2,3,4,5,6};

        IntStream stream = Arrays.stream(arr);
    }

    /**
     *  第三种方式: 通过Stream的of()
     */
    @Test
    void Test4(){
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
    }

    /**
     *  第四种方式: 创建无限流 (不常用)
     */
}

二、中间操作

注意:不执行终止操作的话,中间操作是不会执行触发的。 

        下面的.forEach(System.out::println);就是终止操作,里面可以不是sout,可以是其他的。

        也就是说通过上面的四种方式,Stream流就创建好了,然后就可以进行中间操作了:

        中间操作的话,也分为三种情况: 

                第一种:筛选与切片

                第二种:映射

                第三种:排序

 2.1、中间操作----筛选与切片

 

同理我们还是先把List集合中的数据展示出来:

 filter:

接受Lambda,从流中排除某些元素 (也就是说从集合中排除掉我们不想要的元素)

 @Test
    void Test1(){
        List<Employee> list = EmployeeData.getEmployees();
        Stream<Employee> stream = list.stream(); // 集合通过调用stream方法就创建出Stream了
        /**
         *  创建出Stream,我们就可以比作是Stream中已经现在有了List集合中的那些数据了
         */
        // 然后我们就可以使用中间操作了:
        /**
         *  filter方法: 也就是说使用这个filter中间操作方法的话,就可以排除掉Stream中的一些我们不想要的数据了
         *              (也就是说排除掉一些List集合中我们不想要/不满足条件的数据)
         */
        stream.filter(e -> e.getSalary() >7000).forEach(System.out::println);
    }

 

 

limit:

截断流,使其元素不超过给定数量

(大白话说:也就是说假定我们List集合(Stream)当中有60条数据,但是我们使用这个limit中间操作设定为6,那么我们这个Stream流就只遍历List集合中前6条数据)

  @Test
    void Test2(){
        List<Employee> list = EmployeeData.getEmployees();
        Stream<Employee> stream = list.stream();    // 同理,相当于现在Stream已经拿到了全部的List集合中的数据了
        stream.limit(3).forEach(System.out::println);   // 中间操作进行筛选,最后通过forEach终止操作进行打印结果
    }

 

skip:

也就是说,我们通过给这个skip中间操作指定一个数字,比如指定3,那么我们Stream流遍历List集合中的元素数据的时候,就会跳过前三条数据,也就是说前三条数据不遍历出来了,只遍历前三条以外的其他的数据

 


    @Test
    void Test2(){
        List<Employee> list = EmployeeData.getEmployees();
        Stream<Employee> stream = list.stream();    // 同理,相当于现在Stream已经拿到了全部的List集合中的数据了
        stream.skip(3).forEach(System.out::println);  
    }

 

distinct:

 也就是说去重的意思,比如List集合当中存放的数据有几条是一模一样的,那么Stream流遍历List集合中的数据的时候,只要一条该数据就可以了,其他重复的数据直接去除掉。

 

  @Test
    void Test2(){
        List<Employee> list = EmployeeData.getEmployees();
        Stream<Employee> stream = list.stream();    // 同理,相当于现在Stream已经拿到了全部的List集合中的数据了
        stream.distinct().forEach(System.out::println);
    }

注意: 表示的是对象内存地址一模一样的时候,才会去重,如果仅仅是数据一样那么有可能会去除不掉(是看内存地址的)

2.2、中间操作----映射

map:  (常用)

map的话也是中间操作,和上面的筛选和切片的用法大致上是一样的,只不过作用不同。

map的作用1: 就是说可以把集合中的数据,转换成其他的类型

map的作用2:可以把Stream流当中的List集合数据,单独的获取出来

 @Test
    void Test1(){
        List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
        Stream<String> stream = list.stream();// 第一步:通过集合创建Stream
        stream.map(str -> str.toUpperCase()).forEach(System.out::println);  // 第二步:中间操作 map

    }

 

 作用二演示:

 

 例子演示(*****):

 

 

flatmap:

2.3、中间操作----排序

排序的话,分为 自然排序 和 定制排序。

        自然排序:是对List集合中的不是以对象形式封装存放的数据进行排序的。

        定制排序:如果List集合中存放的是以对象的形式进行存放数据到List集合中的话,那么就需要用定制排序了,要不然就会报错。

sorted()----自然排序:

 

 

sorted()----定制排序:

 

 

补充知识:

        我们有可能会发现,上面通过排序Stream流遍历出List集合中的数据后,有可能我们根据age排序的时候,有的数据age是一样的,那么就不会再对这两个一样的进行排序先后位置了,那么我们该如何 再给如下:这两个age数据相同的数据进行一下排序呢 (整个先后顺序)?

        我们就可以让年龄相等的数据再按照薪资或者其他的数据进行排序(和数据库差不多一样)

 

 

 

三、终止操作

3.1、终止操作----匹配与查找

*  首先 List集合中的数据如下所示:
*          list.add(new Employee(1001,"马化腾",34,6000.38));
*          list.add(new Employee(1001,"马化疼",34,58.0));
*          list.add(new Employee(1002,"马云",60,1672.00));
*          list.add(new Employee(1003,"刘强东",54,1272.01));
*          list.add(new Employee(1004,"雷军",39,60670.96));
*          list.add(new Employee(1005,"李彦宏",6,606760.68));
*          list.add(new Employee(1006,"比尔盖茨",8,60760.7));
*          list.add(new Employee(1007,"任正非",9,6076.8));
*          list.add(new Employee(1008,"扎克波尔",19,60760.18));

allMatch / anyMatch: 

 

noneMatch:

 

findFirst / findAny:

count: 

 max:

 

min:

 

3.2、终止操作----归约

List集合中的数据如下所示:

list.add(new Employee(1001,"马化腾",34,6000.38));
list.add(new Employee(1001,"马化疼",34,58.0));
list.add(new Employee(1002,"马云",60,1672.00));
list.add(new Employee(1003,"刘强东",54,1272.01));
list.add(new Employee(1004,"雷军",39,60670.96));
list.add(new Employee(1005,"李彦宏",6,606760.68));
list.add(new Employee(1006,"比尔盖茨",8,60760.7));
list.add(new Employee(1007,"任正非",9,6076.8));
list.add(new Employee(1008,"扎克波尔",19,60760.18));

reduce:

 reduce(BinaryOperator):

 

3.3、终止操作----收集 (常用)

 

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

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

相关文章

【应用】Docker

DockerDocker 的安装基本安装流程配置镜像加速Docker 常用命令镜像相关命令容器相关命令DockerfileDockerfile 常用指令Dockerfile 简单使用案例Dockerfile 构建 java 项目镜像Docker ComposeDocker compose 基本参数services 配置参数Docker 的安装 基本安装流程 使用虚拟机…

Linux JDK8下载安装

JDK安装 整体步骤介绍 操作步骤: 1 查看自己linux版本位 getconf LONG_BIT(64位) 2. 下载jdk的安装包 这里提供三种方法下载: (以jdk-8u171-linux-x64.tar.gz为例) 2.1 官网下载jdk: 官网: https://www.oracle.com/downloads/ jdk最新版本下载: https://www.oracle.com…

带你玩转序列模型之seq2seq模型定向(集束)搜索

目录 一.基础模型 二.选择最可能的句子 三.定向搜索 四.改进定向搜索 五.定向搜索的误差分析 一.基础模型 在这一周&#xff0c;你将会学习seq2seq&#xff08;sequence to sequence&#xff09;模型&#xff0c;从机器翻译到语音识别&#xff0c;它们都能起到很大的作用…

【数据结构1】数据结构的基本概念

数据结构的基本概念 数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素、数据项&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一…

以太网 TCP协议(TCP交互过程中出现丢包时的解决机制-列举部分)

2.7.3 以太网 TCP协议&#xff08;TCP交互过程中出现丢包时的解决机制-列举部分&#xff09; 参考&#xff1a;CSDN_TCP的重传机制_博主.Pr Young&#xff0c;对描述进行了整理与结合个人的理解进行编写。 一、超时重传机制 在发送数据时&#xff0c;设定一个定时器&#xff0c…

Ubuntu下cmake使用入门

CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。其包含自己的语法结构&#xff0c;只要按照其语法编写成CMakeLists.txt&#xff0c;然后camke程序就能对…

MAML:User Diverse Preference Modeling by Multimodal AttentiveMetric Learning

一、摘要 大多数现有的推荐系统用特征向量表示用户的偏好&#xff0c;当预测该用户对不同项目的偏好时&#xff0c;假设该特征向量是固定的。然而&#xff0c;同一个向量不能准确地捕捉用户对所有项目的不同偏好&#xff0c;特别是在考虑各种项目的不同特征时。为了解决这个问…

【应用】Kubernetes

Kubernetesk8s 安装流程安装前配置安装 docker 以及 k8s 组件初始化 k8s 集群测试使用&#xff1a;安装 kubernetes-dashboardk8s 基础概念k8s 核心技术概念k8s 内部组件k8s 中的 IP 地址K8S 服务暴露的三种方式k8s 安装流程 k8s-masterk8s-node01k8s-node02192.168.86.140192…

【编程题】【Scratch四级】2022.09 三个数排序

三个数排序 输入三个数&#xff0c;比较三个数的大小&#xff0c;并将这三个数按照从小到大的顺序说出。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff0c;默认位置&#xff1b; &#xff08;2&#xff09;白色背景。 2. 功能实现 &#xff08;1&#xff…

Java基于SSM框架的教室预约申请管理系统 毕业设计

本教室管理系统主要包括系统用户管理模块、楼层信息管理模块、校内新闻管理、教室信息管理、登录模块、和退出模块等多个模块。它帮助教室管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了教室管理数据资源,有效的减少了教室管理的…

四旋翼无人机学习第13节--Padstack Editor的简单使用

文章目录0 前言1 绘制MP2120 QFN10封装焊盘(初步学习)1.1 数据手册确定焊盘种类1.2 软件设置焊盘11.3 软件设置焊盘22 绘制DM9000A LQFP48L封装焊盘(初步学习)2.1 数据手册确定焊盘种类2.2 软件设置焊盘3 绘制STC89C51 PDIP-40封装通孔焊盘(初步学习)3.1 数据手册确定焊盘种类3…

【Spring源码系列】Bean生命周期-Bean销毁

前言 Spring给我们提供了一种当bean销毁时调用某个方法的方式。那么&#xff0c;Spring底层到底是如何实现的呢&#xff1f;接下来&#xff0c;我们将从源码案例的方式来解析&#xff1a;spring如何实现当bean销毁时调用某个方法的。 一、Bean销毁介绍 bean销毁的时机 当sp…

[附源码]计算机毕业设计springboot智能衣橱APP

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据增强 - 当数据有限时如何使用深度学习(一)

本文是对图像的深度学习数据增强技术的全面综述前言我们都遇到过这种情况&#xff1a;您有一个可以使用机器学习模型实现的机会&#xff0c;但当您打开网络浏览器并搜索相关数据&#xff0c;很有可能&#xff0c;您会发现一个只有几百张图像的数据集。您记得最受欢迎的数据集的…

【项目_03】日历的回显、搭建热门精选、下拉加载更多、搜索框搭建 | 基于Vue3全家桶

&#x1f4ad;&#x1f4ad; ✨: 日历的回显、搭建热门精选、下拉加载更多、搜索框搭建 | 旅途拾景   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 心若有所向往&#xff0c;何惧道阻且长&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&…

Android入门第38天-使用随鼠标移动的圆点来熟悉onTouchEvent

简介 平时包括之前的例子大量是基于TouchListener如&#xff1a;onClick这种一类的事件。 今天给大家带来的是TouchListener与OnTouchEvent的比较&#xff0c;以及多点触碰的知识点&#xff01; TouchListener是基于监听的&#xff0c;而OnTouchEvent则是基于回调的&#xff…

SNMP协议——网络管理概述

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.网络管理概述 1.网络管理概念 2.网络管理功能 1.配置管理 …

Xshell连接如何记住用户秘钥文件

场景描述 服务器ssh登录有2种常用的方式&#xff1a; 方式1&#xff1a;用户密码认证&#xff0c;登录时输入用户名和密码。方式2&#xff1a;公钥认证(Public Key User Authentication)&#xff0c;登录时提供用户名私钥。公钥需要存储一份在服务器上该用户的~/.ssh/authori…

是德科技DSOX2002A型号示波器的使用

文章目录图使用自检电路单次触发按键恢复出厂设置水平调整区水平位移调整按钮水平时机调整旋钮垂直调整区通道启用按钮垂直档位调节旋钮垂直位移调整旋钮测量区图 使用 自检 黑色鳄鱼夹接地&#xff0c;伸缩探钩挂到左侧。 按下auto按键 使用测量按键可以调出波形的峰峰值与频…

Redis (持续更新…)

提到这个词&#xff0c;脑海里一连串&#xff1a;它是什么&#xff0c;能干什么&#xff0c;怎么干的&#xff0c;不用它行不行&#xff0c;有没有同类…… 其实就是5W2H&#xff0c;或者说凡事多问个为什么 先放官网&#xff1a; ​​​​​​Redis CRUG网站 它是开源存储…