Java基础——Stream流

news2025/2/27 21:02:22

(1)Stream流概述:

1.什么是Stream流?

  • 用于简化集合和数组操作的API。结合了Lambda表达式。
  • 方便操作集合/数组的手段(集合/数组才是开发的目的)。

 2.体验Stream流的作用:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 体验stream流作用
 */
public class StreamDemo01 {
    public static void main(String[] args) {
        //需求:找到名字是小开头的,且长度为3的元素
        List<String> names = new ArrayList<>();
        Collections.addAll(names,"小小","小心心","小星星","大大");
        System.out.println(names);

        //1.遍历查找:
        //1.1从集合中找出小开头的元素放到新集合
        List<String> xiaoList = new ArrayList<>();
        for (String name : names) {
            if (name.startsWith("小")){
                xiaoList.add(name);
            }
        }
        //1.2从小开头的名字集合中找到长度为3的元素放到新集合
        List<String> xiaoThreeList = new ArrayList<>();
        for (String s : xiaoList) {
            if (s.length() == 3){
                xiaoThreeList.add(s);
            }
        }
        System.out.println(xiaoThreeList);

        //2.使用stream流方法     filter:进行过滤     forEach:对每个元素进行输出
        names.stream().filter(s -> s.startsWith("小")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
    }
}

3.Stream流思想:

  • 先得到集合或者数组的Stream流。(就像一根传送带,一次次进行筛选过滤,再输出)
  • 把元素放上去。
  • 然后就用这个Stream流简化的API来方便的操作元素。 

(2)Stream流的获取:

Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。

1.Stream流的三类方法:

  • 获取Stream流:
    • 创建一条流水线,并把数据放到流水线上准备进行操作。
  • 中间方法:
    • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
  • 终结方法:
    • 一个Stream流只能有一个终极方法,是流水线上的最后一个操作。

2.集合获取Stream流的方式:

  • 可使用Collection接口中的默认方法stream()生成流
名称说明
default Stream<E> stream()获取当前集合对象的Stream流

3.数组获取Stream流的方式:

名称说明
public static <T> Stream<T> stream(T[] array)获取当前数组的Stream流
public static<T> Stream<T> of(T... values)获取当前数组/可变数据的Stream流
import java.util.*;
import java.util.stream.Stream;

/**
 * 获取Stream流
 */
public class StreamDemo02 {
    public static void main(String[] args) {
        //1.集合获取Stream流
        //1.1Collection集合获取流
        Collection<String> list = new ArrayList<>();
        Stream<String> s = list.stream();

        //1.2Map集合获取流
        Map<String,Integer> maps = new HashMap<>();
        //对键获取流
        Stream<String> keyStream = maps.keySet().stream();
        //对值获取流
        Stream<Integer> valueStream = maps.values().stream();
        //键值对流 entrySet()==>将Map转Set
        Stream<Map.Entry<String,Integer>> kvStream = maps.entrySet().stream();

        //2.数组获取流
        String[] names = {"大大","小小","青青","晨晨"};
        Stream<String> arrStream = Arrays.stream(names);//方式1
        Stream<String> arrStream01 = Stream.of(names);//方式2

    }
}

4.Stream流常用的API(中间操作方法)

  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合,数组中的数据。
名称说明
Stream<T> filter(Predicate<? super T> predicate)用于对流中的数据进行过滤
Stream<T> limit(long maxSize)获取前几个元素
Stream<T> skip(long n)跳过前几个元素
Stream<T> distinct()去除流中重复的元素,依赖(hashCode和equals方法)
static <T> Stream<T> concat(Stream a,Stream b)合并a和b两个流为一个流
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * Stream流常用的API
 */
public class StreamDemo03 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("大大");
        list.add("小小");
        list.add("小青青");
        list.add("小晨晨");

        //找出集合元素以小开头的元素
        //1. 用于对流中的数据进行过滤 Stream<T> filter(Predicate<? super T> predicate)
//        list.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                return s.startsWith("小");
//            }
//        });

        //简化1
//
//        list.stream().filter( s -> s.startsWith("小")).forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });

        //简化2
        list.stream().filter( s -> s.startsWith("小")).forEach( s -> System.out.println(s));

        //统计集合元素长度等于3的个数
        long size = list.stream().filter(s -> s.length() == 3).count();
        System.out.println(size);

        //2.获取前几个元素 Stream<T> limit(long maxSize)
        //list.stream().filter(s -> s.startsWith("小")).limit(2).forEach(s -> System.out.println(s));
        //简化
        list.stream().filter(s -> s.startsWith("小")).limit(2).forEach(System.out::println);

        //3.跳过前几个元素  Stream<T> skip(long n)
        list.stream().filter(s -> s.startsWith("小")).skip(2).forEach(System.out::println);

        //4.map加工方法:第一个参数是原材料,第二个参数是加工后的结果
        //给集合元素前面加一个,我的
        list.stream().map(s -> "我的" + s).forEach(System.out::println);

        //5.合并a和b两个流为一个流    static <T> Stream<T> concat(Stream a,Stream b)
        Stream<String> s1 = list.stream().filter(s -> s.startsWith("小"));
        Stream<Integer> s2 = Stream.of(1,2);
        Stream<Object> s3 = Stream.concat(s1,s2);
        s3.forEach(System.out::println);
    }
}

5.Stream流的常见终极操作方法:

  • 终极操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了
名称说明
void forEach(Consumer action)对此流的每个元素执行遍历操作
long count()返回此流中的元素数

(3)Stream流的收集: 

1.收集Stream流的含义:

  • 收集Stream流的含义就是把Stream流操作后的结果数据转回到集合或者数组中去。

2.Stream流的收集方法:

名称说明
R collect(Collector collector)开始收集Stream流,指定收集器

Collectors工具类提供了具体的收集方式:

名称说明
public static <T> Collector toList()把元素收集到List集合中
public static <T> Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中

=================================================== 

 

 

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

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

相关文章

高并发场景I/O优化

大家好&#xff0c;我是易安&#xff01; Java I/O是一个众所周知的概念。它常被用于读写文件、实现Socket信息传输等操作&#xff0c;这些都是系统中最常见的与I/O相关的任务。 我们都了解&#xff0c;I/O的速度相较于内存速度较慢。在当前大数据时代背景下&#xff0c;I/O性能…

java足球体育新闻资讯发布系统ssh

为 本系统的功能目标分为以下几个模块&#xff1a;用户管理模块、足球新闻类别管理模块、足球新闻管理模块、留言管理模块和前台足球新闻浏览模块。 系统功能模块的划分&#xff0c;是在需求分析基础上进行的&#xff0c;是把具有复杂功能的系统通过设计分解为具有基本独立&…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的&#xff0c;这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…

MySQL:事务、索引、用户管理、备份、数据库设计(三大范式)

文章目录Day 03&#xff1a;一、事务1. 原则2. 测试实现二、索引1. 分类2. 创建索引3. 分析 sql 执行的状况4. 测试索引5. 索引原则三、数据库用户管理四、备份五、规范数据库设计1. 三大范式注意&#xff1a;Day 03&#xff1a; 一、事务 事务(transaction)&#xff1a;要么…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

『pyqt5 从0基础开始项目实战』04. 表格数据的初始化(保姆级图文)

目录导包和框架代码准备json数据文件表格数据接入1. 准备文件路径2. 读取json数据3. 将得到的json数据放入table设置单元格不可修改把数据中的数字转为映射内容完整代码总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项…

TiDB实战篇-备份恢复策略

简介 简要说明TiDB备份恢复策略。 备份的类型 热备 TiDB使用MVCC机制实现设备的。 冷备 需要停机备份。 温备 备份的时候只能读不能够写。 备份技术 逻辑备份 物理备份 物理备份的限制 基于复制的备份 复制恢复是最快的。&#xff08;TiDB CDC,TiDB Binlog&#xff…

【C语言】函数详解(嵌套调用和链式访问、声明及定义、递归)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1.函数的嵌套调用和链式访问 1.1 嵌套调用 1.2 链式访问 2. 函数的声明和定义 2.1 函数声明 2.2 函数定义 3. 函数递归 3.1 什么是递归&#xff1f; 3.2 递归的两个必要条件 3.2.1 练习1&#xff08;需要画图…

Spring Security实战(三)—— 自动登录与注销登录

目录 一、实现自动登录 1. 散列加密方案 2. 持久化令牌方案 二、注销登录 一、实现自动登录 自动登录是将用户的登录信息保存在用户浏览器的cookie中&#xff0c;当用户下次访问时&#xff0c;自动实现校验并建立登录态的一种机制。 Spring Security 提供了两种非常好的令牌&a…

C ++ 基础入门。加强变量、指针、结构体理解

1、 const放外面&#xff0c;值不可以改。只读 同理于指针 看const右侧紧跟着的是指针还是常量, 是指针就是常量指针&#xff0c;是常量就是指针常量 const 放外面&#xff0c;值不可以改 2、 所有的指针类型&#xff0c;包括结构体指针 double * int *都是和操作系统位数…

补充——spark RDD序列化和持久化

目录 RDD序列化 闭包检查&#xff1a; 序列化方法和属性 Kryo序列化框架&#xff1a; RDD持久化&#xff08;RDD persistence&#xff09; RDDCache缓存 RDD persist缓存 什么时候使用persist()? RDD CheckPoint 检查点 缓存和检查点区别 RDD序列化 闭包检查&#x…

JavaScript 的基础函数有哪些?

1、在 JavaScript 中将数组本地转换为对象 JavaScript 有一个原生函数 Object.fromEntries&#xff0c;可用于将任何输入数组转换为对象。 1.const anArray [ 2. [firstname, Paul], 3. [surname, Knulst], 4. [address, worldwide], 5. [role, Senior Engineer], 6. […

Java中的异常Exception和捕获,自定义异常

文章目录1. 异常概述1.1 什么是程序的异常1.2 异常的抛出机制1.3 如何对待异常2. Java异常体系2.1 Throwable2.2 Error 和 Exception2.3 编译时异常和运行时异常3. 常见的错误和异常3.1 Error3.2 运行时异常3.3 编译时异常4. 异常的处理4.1 异常处理概述4.2 捕获异常&#xff0…

springboot整合websocket

1.创建springboot项目&#xff0c;引入spring-boot-starter-websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>全部依赖如下&#xff1a; &l…

JDBC之DAO层封装思想超详解

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 运行环境&#xff1a;win10 家庭中文版 jdk版本&#xff1a;1.8.0_361 目录一、DAO是什么&#xff1f;二、案例演示2.1 准备数据2.2 创建bean包2.3 建立DAO包2.2…

Houdini>RBD(搅拌大米效果)并导出FBX到unity

Houdini&#xff1e;RBD(搅拌大米效果) 效果展示&#xff1a; 动图录制软件&#xff1a;Cockos Incorporated | LICEcap 参考链接&#xff1a;导出除了ABC外&#xff0c;比较小的FBX文件用法 目录&#xff1a; 一、引用模型的处理&#xff1a; 1、大米 模型创建 多层复制 …

Mybatis(六)缓存

缓存是Mybatis中非常重要的特性&#xff0c;Mybatis的一级缓存基于SqlSession实现&#xff0c;二级缓存基于Mapper实现。 一、缓存的使用 一级缓存默认开启&#xff0c;Mybatis提供了一个配置参数localCacheScope来控制一级缓存的级别&#xff0c;该参数的取值可以是session、…

【机器学习】P10 从头到尾实现一个线性回归案例

这里写自定义目录标题&#xff08;1&#xff09;导入数据&#xff08;2&#xff09;画出城市人口与利润图&#xff08;3&#xff09;计算损失值&#xff08;4&#xff09;计算梯度下降&#xff08;5&#xff09;开始训练&#xff08;6&#xff09;画出训练好的模型&#xff08;…

参加Matlab与AI讲座:使用深度强化学习训练走路机器人观后感

时间&#xff1a;2023年4月12日&#xff0c;周三&#xff0c;天气晴 地址&#xff1a;大连理工大学研教楼303 前言&#xff1a;Matlab其实有很多功能&#xff0c;我们所用的只是最基础最简单的部分&#xff0c;例如矩阵计算&#xff0c;画图等等。 随着强化学习的发展&#xff…

一般形式的S曲线公式推导

文章目录一、背景二、目标三、计算3.1 S曲线基本形式3.2 S曲线变换3.3 参数计算3.4 S曲线中心对称条件四、总结五、附件一、背景 S曲线因具备良好可控的平滑性、单调性、连续可导性等优点&#xff0c;常作为各类电机升降速曲线。当前多数S曲线的介绍文章未给出推导过程&#x…