Java Stream

1. Stream API概述

        Java 8 Stream是Java 8中引入的一个新的API,用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作,例如过滤、映射、排序等,而不需要编写循环或迭代器等底层代码。

        Java 8 Stream与集合不同,它并不是一个数据结构,而是一种可操作的流。流可以是无限的,也可以是有限的。在使用流进行操作时,不会改变原始数据集合中的数据,而是返回一个新的流。

        Stream API包含了丰富的操作方法,例如过滤、映射、排序、归约等,使得对数据集合进行操作变得非常方便。Java 8 Stream的使用可以极大地简化代码,并提高代码的可读性和可维护性。

2. 初识Stream API

        用一个案例来认识StreamAPI的使用:过滤“J”开头的用户名。

        方式一:用传统的循环方式处理

List<String> names = Arrays.asList("John", "Jane", "Bob", "Tom");
//传统Java编码实现找出J开头的人名
List<String> jNames = new ArrayList<>();
for (String name : names){
    if (name.startsWith("J")){
        jNames.add(name);
    }
}
System.out.println(jNames);// 输出:[John, Jane]

        方式二:用 Stream API

//使用Stream API实现找出J开头的人名
List<String> filteredNames = names.stream().filter(name -> name.startsWith("J")).collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[John, Jane]

        上述代码中采用了两种方式实现了过滤“J”开头的用户名,一种是传统for循环方式,另外一种就是Stream API。可以看到使用Stream方式可以大大简化代码。Stream方式中,先使用stream()方法将集合转换为流,然后使用filter()方法筛选以“J”开头的字符串,最后使用collect()方法将筛选后的结果转换为List集合。

3. 常用Stream API方法

        Java 8中常用的Stream API主要包括以下几个:

  • filter:过滤流中的元素,只保留符合条件的元素
  • map:对流中的元素进行映射,将一个元素映射为另一个元素
  • flatMap:对流中的元素进行扁平化映射,将一个元素映射为多个元素
  • sorted:对流中的元素进行排序
  • distinct:去重,保留流中的不同元素
  • limit:限制流中元素的数量
  • skip:跳过流中的前N个元素
  • forEach:遍历流中的元素
  • reduce:对流中的元素进行归约,得到一个结果
  • collect:将流中的元素收集到一个集合中
  • min和max:找出流中的最小值和最大值
  • count:统计流中元素的数量
  • anyMatch、allMatch和noneMatch:判断流中的元素是否满足某个条件
  • findFirst和findAny:找到流中的第一个元素和任意一个元素
  • parallel和sequential:切换流的并行和串行模式

        上述API定义在集合类和Collectors类上,可以让我们对流进行过滤、映射、排序、去重、统计、归约等常见的操作,并且提供了并行处理的支持,可以充分利用多核处理器的性能,提高程序的执行效率。

4. Stream API的使用步骤

        Java 8 Stream API的使用方法主要分为以下几个步骤:

        1、创建流

        通过集合、数组或者Stream类中提供的静态方法创建流。例如,通过集合创建流:

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();

        2、中间操作

        对流进行中间操作,可以使用filter、map、flatMap、sorted、distinct、limit、skip等操作。例如,使用filter方法过滤集合中的元素:

stream = stream.filter(s -> s.startsWith("a"));

        3、终止操作

        对流进行终止操作,可以使用forEach、reduce、collect、min、max、count等操作。例如,使用forEach方法遍历流中的元素:

stream.forEach(System.out::println);

        4、并行处理

        对于大数据集,可以使用并行流来提高程序的执行效率,可以使用parallel和sequential方法来切换并行和串行模式。例如,使用parallel方法将流转换为并行流:

stream = stream.parallel();

        以上是Java 8 Stream API的使用方法,可以通过这些步骤来创建、操作和处理流。需要注意的是,在使用Stream API时,应该避免在操作中修改流中的元素,以免出现意外的结果。

5. Stream API的使用示例

        1、筛选数据

        筛选数据:筛选以“J”开头的字符串。代码示意如下:

List<String> names = Arrays.asList("John", "Jane", "Bob", "Tom");
List<String> filteredNames = names.stream().filter(name -> name.startsWith("J"))
        .collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[John, Jane]

        上述代码中,使用stream()方法将集合转换为流,然后使用filter()方法筛选以“J”开头的字符串,最后使用collect()方法将筛选后的结果转换为List集合。

        2、映射数据

        映射字符串的长度,代码示意如下:

List<String> names = Arrays.asList("John", "Jane", "Bob", "Tom");
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());
System.out.println(nameLengths); // 输出:[4, 4, 3, 3]

        上述代码中,使用stream()方法将集合转换为流,然后使用map()方法将字符串映射为字符串长度,最后使用collect()方法将映射后的结果转换为List集合。

        3、统计数据

        统计数据,代码示意如下:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream().count();
int max = numbers.stream().max(Integer::compare).orElse(0);
int min = numbers.stream().min(Integer::compare).orElse(0);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
double average = numbers.stream().mapToInt(Integer::intValue).average().orElse(0.0);
System.out.println("Count: " + count); // 输出:Count: 5
System.out.println("Max: " + max); // 输出:Max: 5
System.out.println("Min: " + min); // 输出:Min: 1
System.out.println("Sum: " + sum); // 输出:Sum: 15
System.out.println("Average: " + average); // 输出:Average: 3.0

        上述代码中,使用count()方法统计流中元素的个数,使用max()和min()方法求出流中的最大值和最小值,使用sum()方法求出流中元素的总和,使用average()方法求出流中元素的平均值。

        4、排序数据

        实现数据排序,代码示意如下:

List<Integer> numbers = Arrays.asList(3, 2, 1, 5, 4);
List<Integer> sortedNumbers = numbers.stream().sorted().collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出:[1, 2, 3, 4, 5]

        上述代码中,使用sorted()方法对流中的元素进行排序,最后使用collect()方法将排序后的结果转换为List集合。

        以上是一些Java 8 Stream API的基本案例,这些案例只是展示了Stream API的基本用法,还有更多丰富的操作可以使用,例如归约、去重、分组、分区等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站实现微信扫码登录(利用微信开放平台实现)

第一步&#xff1a;微信开放平台账户申请 网址&#xff1a;微信开放平台 1.首先我们要做的就是进入到微信开放平台申请一个开放平台账户&#xff0c;获得资质&#xff01; &#xff1a;注册需要准备营业执照、1-2个工作日审批、300元认证费 &#xff1a;注册之后&#xff0…

MP4提取gif怎么操作?分享一招快制作

随着各种社交媒体的发展&#xff0c;越来越多的人在聊天中使用gif表情包来调节自己的聊天氛围。搞笑的gif表情包能够为我们平淡的生活添砖加瓦&#xff0c;带给我们一些轻松和欢乐。如果想要自己制作gif动画的时候就可以用视频转gif的工具&#xff0c;能够在不下载软件的情况下…

1055: 邻接矩阵到邻接表

解法&#xff1a; #include<iostream> using namespace std; int arr[100][100]; int main() {int n;cin >> n;for (int i 0; i < n; i) {for (int j 0; j < n; j) {cin >> arr[i][j];}}for (int i 0; i < n; i) {for (int j 0; j < n; j) …

27、Qt自定义标题栏

一、说明 QtWidget及其子类有默认的标题栏&#xff0c;但是这个标题栏不能美化&#xff0c;有时候满足不了我们的使用需求&#xff0c;所以进行自定义标题栏 二、下载图标 在下面的链接中下载两种颜色的最大化、向下还原、最大化和关闭八个图片&#xff0c;并找一张当做图标…

【LeetCode刷题记录】简单篇-108-将有序数组转换为二叉搜索树

【题目描述】 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 【测试用例】 示例1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,…

苹果 iPhone 15 Pro Max 称霸:智能手机市场势不可挡

苹果 iPhone 15 Pro Max 称霸&#xff1a;智能手机市场势不可挡 概述 在拥挤且竞争激烈的智能手机市场中&#xff0c;苹果的 iPhone 15 Pro Max 成为明显的赢家&#xff0c;在 2024 年第一季度最畅销智能手机排行榜上名列前茅。根据 Counterpoint Research 的数据&#xff0c…

【C++】string类的使用③(修改器Modifiers || 非成员函数重载Non-member function overloads)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;修改器&#xff08;Modifiers&#xff09;**operator**appendpush_back和pop_backassigninserterasereplaceswap &#x1f525;非成员函数重载&#xff…

【声呐仿真】学习记录2.5-DAVE项目部分文档大纲

【声呐仿真】学习记录2.5-DAVE项目 一、Dave Models 模型Vehicle Models 航行器模型New Underwater Vehicle 新型水下航行器Dave ROV ModelsDave Glider ModelsManipulator Models 机械臂模型UUV Simulator Examplesrexrovrexrov2desistek saga roveca_a9Light Autonomous Unde…

二叉搜索树模拟实现

目录 认识二叉搜索树&#xff1a; 模拟实现&#xff1a; 节点结构体构建&#xff1a; insert&#xff08;插入&#xff09;: find&#xff08;查找&#xff09;&#xff1a; erase&#xff08;删除&#xff09;&#xff08;重点&#xff09;&#xff1a; 全部代码 认识二叉…

[算法][单调栈] [leetcode]316. 去除重复字母

去除重复字母 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的 字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 字典序最小&#xff1a; 考虑字符串 a 与 字符串 b&#xff0c;如果字…

Pytest测试实战 —— 分布式执行!

在这篇文章中&#xff0c;我们将从头开始介绍如何使用Pytest进行测试实战&#xff0c;并探讨如何在分布式环境中执行测试。Pytest是一个功能强大且易于使用的Python测试框架&#xff0c;它提供了丰富的功能和灵活的配置选项&#xff0c;使得编写和执行测试变得简单而又高效。 …

决策管理中的数学方法

需要注意的是,用excel求解的时候需要导入线性规划加载项如下: pert分析需要DecisionTools中的RiskSolver插件 1.链接:https://pan.baidu.com/s/1wKhUFWgNmQ7U33kl5AypZw 提取码:zqkn 2.“Palisade_Book_expires_Aril_10_2025.lic”文件复制到以下路径: C:\Program Files …

在视频号搞变现,又不想直播,可以试试它!

大家好&#xff0c;我是电商糖果 视频号这两年流量比较大&#xff0c;甚至有了即将赶超抖音&#xff0c;快手的趋势。 再加上它的用户都是来自微信&#xff0c;属于是私域流量。 所以视频号的用户粘性比较大&#xff0c;而且非常容易变现。 就有不少人想在视频号搞变现&…

保健品小程序商城线上经营的作用是什么

保健品涵盖酒水、醋、食品等多个类型&#xff0c;无论厂商还是经销商&#xff0c;手里的品牌和数量都比较多&#xff0c;由于特殊性&#xff0c;商家经营时需要找到目标客户&#xff0c;而市场中虽然有大量客户&#xff0c;但商家实际想要触达却并不容易。 渠道多样化&#xf…

C#知识|无边框的WinForm窗体,如何拖动位置?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 上一节时练习做了一个简单的登录窗体界面&#xff0c;为了美观设置成了无边框&#xff0c; 当运行起来&#xff0c;发现无边框的窗体无法用鼠标拖动位置&#xff0c; 本节记录通过添加代码实现无边框窗体实现移动&…

VR智慧文旅:开启“韵味”旅游季的新篇章

为了充分满足游客的假日文化旅游需求&#xff0c;各地纷纷“解锁”新花样&#xff0c;沉浸式实景观展震撼“出圈”。在数字化浪潮的推动下&#xff0c;文化旅游行业正经历着变革&#xff0c;在万物皆可沉浸的时代&#xff0c;VR智慧文旅燃起了不一样的热度。 许多业内人士认为&…

【数据结构】顺序表(一)

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 不怕别人看不起&#xff0c;就怕自己不争气。路是人走出来的&#xff0c;关键要靠自己闯。振作起来&#xff0c;生活的含义就是前进。 目录 一、顺序表的概念&#xff1a; 二…

安卓实现视频录制与显示和翻转摄像头

权限&#xff1a; <!-- 相机权限 --> <uses-featureandroid:name"android.hardware.camera"android:required"false" /> <uses-permission android:name"android.permission.CAMERA" /><!-- 录音权限&#xff08;包括麦克…

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

数据结构(一)绪论

2024年5月11日 一稿 数据元素+数据项 逻辑结构 集合 线性结构 树形结构 </