【java 8】强大的 Stream API

news2025/7/20 14:15:00

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

目录

    • 📋 个人简介
  • 前言
    • Stream API 说明
    • 为什么要使用Stream API
    • 什么是 Stream
    • Stream 的操作三个步骤
    • 创建 Stream 的四种方式(Stream的实例化)
    • Stream 的中间操作
      • 筛选与切片
      • 映射
      • 排序
    • Stream 的终止操作
      • 匹配与查找
      • 归约
      • 收集
  • 结语

前言

java 8中有两个最为重要的改变,第一个就是前面总结的Lambda表达式,另为一个则是Stream API。
这节我将总结一下!

Stream API 说明

  • Stream API ( java.util.stream )把真正的函数式编程风格引入到 Java 中。这
    是目前为止对 Java 类库最好的补充,因为 Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。
  • Stream 是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之, Stream API 提供了一种高效且易于使用的处理数据的方式。

为什么要使用Stream API

  • 实际开发中,项目中多数数据源都来自于 Mysql , Oracle 等。但现在数
    据源可以更多了,有 MongDB , Redis 等,而这些 NoSQL 的数据就需要 Java 层面去处理。
  • Stream 和 Collection 集合的区别: Collection 是一种静态的内存数据
    结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU ,通过 CPU 实现计算。

什么是 Stream

Stream 到底是什么呢?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据, Stream 讲的是计算!”
注意:
① Stream 自己不会存储元素。
② Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream .
③ Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream 的操作三个步骤

1、创建 Stream
一个数据源(如:集合、数组),获取一个流
2、中间操作
一个中间操作链,对数据源的数据进行处理
3、终止操作(终端操作)
一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

在这里插入图片描述

创建 Stream 的四种方式(Stream的实例化)

public class Demo {
    public static void main(String[] args) {
        // 创建Stream的方式一:通过集合
        // default Stream<E> stream():返回一个顺序流
        List list = new ArrayList();
        Stream stream1 = list.stream();
        // default Stream<E> paralleStream():返回一个并行流
        Stream stream2 = list.parallelStream();

        // 创建Stream的方式二:通过数组
        int[] arr = new int[]{1,2,3};
        // 调用Arrays类的static<T> Stream<T> stream(T[] array):返回一个流
        IntStream stream = Arrays.stream(arr);

        // 创建Stream的方式三:通过Stream的of()
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);

        // 创建Stream的方式四:创建无限流
        // 迭代
        // public static<T> Stream<T> iterate(final T seed,final UnaryOperator<T> f)
        // 例:遍历前10个偶数
        Consumer<Integer> println = System.out::println;
        Stream.iterate(0, t -> t+2).limit(10).forEach(println);
        
        // 生成
        // public static<T> Stream<T> generate(Supplier<T> s)
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
    }
}

Stream 的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为"惰性求值"

筛选与切片

请添加图片描述

// Stream 的中间操作
  // 筛选与切片
  List<String> list = Arrays.asList("阿牛", "小牛", "大牛", "小红");
  Stream<String> stream = list.stream();
  // filter(Predicate p)  -- 接收Lambda,从流中排出某些信息
  stream.filter(str -> str.contains("牛")).forEach(System.out::println);   //forEach终止操作,传入一个函数式接口中的消费者

在这里插入图片描述

 List<String> list = Arrays.asList("阿牛", "小牛", "大牛", "小红");

 Stream<String> stream1 = list.stream();
 // limit(n)  -- 截断流,使其元素不超过给定数量
 stream1.limit(2).forEach(System.out::println);
 System.out.println("----------");

 Stream<String> stream2 = list.stream();
 // skip(n)  -- 跳过元素,返回一个人扔掉前n个元素的流,若流中元素不足n个,则返回一个空流
 stream2.skip(3).forEach(System.out::println);
 System.out.println("----------");

 List<String> list1 = Arrays.asList("阿牛", "小牛", "大牛", "小红","阿牛"); // 添加一个重复元素
 Stream<String> stream3 = list.stream();
 // distinct() -- 筛选,通过流所生成元素的hashcode()和equals()去除重复元素
 stream3.distinct().forEach(System.out::println);

在这里插入图片描述

映射

请添加图片描述

// 映射
// map(Function f) -- 接受一个函数作为参数,这个函数应用到每个元素上,将元素映射为一个新的元素
List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);

// flatMap(Function f) -- 接受一个函数作为参数,将流中的每个值都映射为另一个流,然后把所有的流连在一起
// 这个我不举例子了,主要可以处理结集合的嵌套,两层嵌套直接用flatMap就不用写两层forEach了

在这里插入图片描述

排序

请添加图片描述

// 排序
// sorted()  --自然排序
List<Integer> list= Arrays.asList(12, 14, 3, 6, 10);
list.stream().sorted().forEach(System.out::println);
System.out.println("--------");
// sorted(Comparator com)  --定制排序
list.stream().sorted((s1,s2) -> -Integer.compare(s1,s2)).forEach(System.out::println);

在这里插入图片描述

Stream 的终止操作

匹配与查找

请添加图片描述
请添加图片描述
这里不再写案例!

归约

请添加图片描述

// 归约
// reduce(T identity,BinaryOperator) - 可以将流中的元素反复结合起来,得到一个值,返回T
// T identity是初始值,BinaryOperator是函数式接口,接受T类型的两个值,返回T类型。
// 例:求1-10的和
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer sum = list.stream().reduce(0, Integer::sum);
System.out.println(sum); //55

// reduce(BinaryOperator) - 可以将流中的元素反复结合起来,得到一个值,返回optional<T>

收集

请添加图片描述
请添加图片描述

  // 收集
  // collect(Collector c)
  // 例:过滤列表中大于5的元素,结果返回一个List

  List<Integer> list = Arrays.asList(1, 2, 5, 6, 8, 7);
  List<Integer> list1 = list.stream().filter(integer -> integer > 5).collect(Collectors.toList());
  System.out.println(list1);

在这里插入图片描述

结语

还是比较抽象的,你们可以下去多了解了解!

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门

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

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

相关文章

因子分析计算权重

因子分析两类权重计算方法总结 案例背景 疫情爆发以来&#xff0c;越来越多的人为了避免线下与人接触&#xff0c;选择了线上购买生活必需品。网购虽然方便快捷&#xff0c;但是随着订单压力的增加&#xff0c;物流问题也随之出现&#xff0c;近期有很多卖家收到物流投诉的问题…

Ubuntu下Python的安装及管理

Ubuntu下Python的安装及管理 1.概述 Ubuntu下python的安装及配置。 2.安装 安装python2.7&#xff1a; python --version #或python2.7 --version检查检查python是否存在&#xff0c;有则无需继续安装python2.7 sudo apt-get update sudo apt-get install python #或者su…

【正点原子FPGA连载】第十五章eMMC读写测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十五章eMMC读写…

BI工具术语表大全:从字母A-Z全面收录

谈到商业智能行业&#xff0c;变革是不可避免的。为了跟上步伐&#xff0c;各种各样的BI 解决方案正在快速迭代更新&#xff0c;以满足企业的数字化需求&#xff0c;那么市场上BI 工具种类繁杂&#xff0c;到底如何选择适合功能全面、满足自己企业运转情况的、合适的BI 工具呢&…

来啦来啦,续篇来啦,CMOS逻辑IC基本工作原理总结概述

在上一篇文章中我们已经认识了CMOS逻辑IC的基本知识和分类&#xff0c;由于功耗和成本以及复杂度的平衡性最好&#xff0c;是实际应用中最常用的一种。今天我们就详细跟大家一起了解东芝CMOS逻辑IC的基本工作原理还有其CMOS逻辑IC系列型号选型吧。 东芝CMOS逻辑IC系列型号选型表…

什么是主数据

整理不易&#xff0c;转发请注明出处&#xff0c;请勿直接剽窃&#xff01; 点赞、关注、不迷路&#xff01; 摘要&#xff1a;主数据定义、解释&#xff1b;主数据管理意义、管理工具 定义&#xff1a;主数据是企业内核心业务实体数据。 解释&#xff1a;主数据&#xff08;Ma…

gRPC Ecosystem 初探

grpc是目前使用很广泛的远程过程调用库&#xff0c;在使用过程中&#xff0c;我们通常会使用protoc命令将proto文件转成特定的代码进行使用。那一些复杂点的应用有没有可以支撑的工具或类库呢。 前段时间在进行自定义grpc tls证书认证的过程中&#xff0c;知道了有一个github项…

【重庆邮电大学协办】2023年第六届数据挖掘与知识发现国际会议(DMKD 2023)

【重庆邮电大学协办】2023年第六届数据挖掘与知识发现国际会议(DMKD 2023) 重要信息 会议网址&#xff1a;www.icdmkd.org 会议时间&#xff1a;2023年6月24-26日 召开地点&#xff1a;中国-重庆 截稿时间&#xff1a;2023年5月24日 录用通知&#xff1a;投稿后2周内 收录…

测试部门来了个99年的卷王之王,老油条感叹真干不过,但是...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计

前言 一. 解决缓存不命中&#xff08;高并发操作击穿打挂DB的风险&#xff09; 当并发量打的时候&#xff0c;当我们的缓存过期时&#xff0c;就算到数据库的比例偏小的时候&#xff0c;我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下&#xff08;总体…

电商共享购模式,消费增值返利,app开发

在当今以市场需求为主导的数字经济时代&#xff0c;消费者需求呈现出精细化管理和多元化的特性&#xff0c;目标市场日渐完善&#xff0c;另外在大数据技术迅速进步和运用的驱动下&#xff0c;总体行业的发展节奏感也在不断加速。因而&#xff0c;企业需要建立一套灵活多变的经…

【Leedcode】数据结构中链表必备的面试题(第五期)

【Leedcode】数据结构中链表必备的面试题&#xff08;第五期&#xff09; 文章目录【Leedcode】数据结构中链表必备的面试题&#xff08;第五期&#xff09;1.题目2.思路图解&#xff08;1&#xff09;第一步&#xff1a;复制每一个结点&#xff0c;插入到原结点和下一个结点之…

OAK相机如何将yolox模型转换成blob格式?(0.1.1pre 及之后版本)

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

新能源充电桩控制板迭代升级,打开充电桩行业发展新机遇

作为新能源汽车可持续发展的关键因素&#xff0c;充电桩的基础建设和完善一直备受关注。伴随着新能源汽车充电桩规模的扩大和停车位的增加&#xff0c;传统的充电桩控制板已经无法满足人们的充电需求&#xff0c;同时急需加强对新能源汽车充电桩的有效管理&#xff0c;新能源充…

Kali Linux使用Metasploit生成木马入侵安卓系统

额&#xff0c;这是我最后一篇文章了&#xff0c;周一我们开学了 文章目录前言一、Metasploit是什么&#xff1f;演示环境二、生成可执行木马文件1.生成2.运行命令并生成木马配置参数入侵安卓手机命令1.查看对方手机系统信息查看对方手机安装哪些app文件总结前言 前言&#xf…

Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙

Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙 请访问原文链接&#xff1a;https://sysin.org/blog/sfos-19-5/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org Sophos Firewall v19.5 现已推出 Sophos Firewall…

H5视频上传与播放

背景 需求场景&#xff1a; 后台管理系统&#xff1a; &#xff08;1&#xff09;配置中支持上传视频、上传成功后封面缩略图展示&#xff0c;点击后自动播放视频&#xff1b; &#xff08;2&#xff09;配置中支持上传多个文件&#xff1b; 前台系统&#xff1a; &#…

游戏增长专题-构建游戏分析技术Game Analytic Pipeline与量江湖分享

文章目录亚马逊云科技游戏孵化营-游戏增长主题从事数据分析的起因加入游戏孵化营构建游戏分析技术Game Analytic Pipeline游戏公司的数据分析需求需要收集的数据游戏数据分类Game Analytics Pipline解决方案Game Analytics Pipline演示量江湖 CEO 赵晔 分享专题总结亚马逊云科技…

vue前端项目分享facebook、twitter、linkedin

背景 如果你FaceBook和twitter的分享机制就知道&#xff0c;当你分享数据到他们的网站&#xff0c;会有爬虫机器人一直在读取并解析你的数据&#xff08;meta里面的&#xff09;&#xff0c;所以怎么让你的meta数据被抓到&#xff1f; 问题 Vue的页面公用一个HTML&#xff0…

Golang学习Day2

Go语言中的函数go语言中函数特性go语言有三种函数&#xff1a;普通函数、匿名函数&#xff08;没有名称的函数&#xff09;方法&#xff08;定义在struct上的函数&#xff09;。receivergo语言中不运算函数重载&#xff08;overload&#xff09;&#xff0c;也就是说不允许函数…