Java Stream API 操作完全攻略:让你的代码更加出色 (三)

news2024/11/28 12:40:45

前言

  Java Stream 是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用 Stream 操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍 Java Stream 操作的所有方面,包括 groupingBy、groupingBy、joining、mapping 等操作,让你的代码行云流水,更加优雅。

  1. groupingBy():按照指定条件对 Stream 中的元素进行分组。
  2. partitioningBy():按照指定条件对 Stream 中的元素进行分区。
  3. joining():将 Stream 中的元素连接成一个字符串。
  4. mapping():根据指定的 Function 对 Stream 中的元素进行映射,并返回一个新的 Stream。
  5. flatMapping():将每个元素映射为一个 Stream,然后将这些 Stream 连接成一个 Stream。
  6. iterating():使用指定的种子值创建一个 Stream,并依次对每个元素进行指定的操作。
  7. empty():返回一个空的 Stream。
  8. of():根据指定的元素创建一个 Stream。
  9. concat():将多个 Stream 连接成一个 Stream。
  10. unordered():返回一个无序的 Stream。

示例

1. 使用 groupingBy() 按照字符串长度对字符串列表进行分组

代码示例:

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingByExample {
    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("hello", "world", "java", "stream");

        Map<Integer, List<String>> result = stringList.stream()
                .collect(Collectors.groupingBy(String::length));

        System.out.println(result);
    }
}

输出结果:

{5=[hello, world], 4=[java], 6=[stream]}

2.使用 partitioningBy() 将数字列表按照是否为偶数进行分区

代码示例:

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class PartitioningByExample {
    public static void main(String[] args) {
        List<Integer> numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        Map<Boolean, List<Integer>> result = numberList.stream()
                .collect(Collectors.partitioningBy(n -> n % 2 == 0));

        System.out.println(result);
    }
}

输出结果:

{false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}

3.使用 joining() 将字符串列表中的元素用逗号连接成一个字符串

代码示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class JoiningByExample {
    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("hello", "world", "java", "stream");

        String result = stringList.stream()
                .collect(Collectors.joining(","));

        System.out.println(result);
    }
}

输出结果:

hello,world,java,stream

4.使用 mapping() 将字符串列表中的元素转换为大写字母

代码示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MappingByExample {
    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("hello", "world", "java", "stream");

        List<String> result = stringList.stream()
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println(result);
    }
}

输出结果:

[HELLO, WORLD, JAVA, STREAM]

5.使用 flatMapping() 将嵌套的字符串列表展平为一个字符串列表

代码示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMappingByExample {
    public static void main(String[] args) {
        List<List<String>> nestedList = Arrays.asList(
                Arrays.asList("hello", "world"),
                Arrays.asList("hello","java", "stream"));

        List<String> result = nestedList.stream()
                .flatMap(List::stream)
                .distinct()
                .collect(Collectors.toList());

        System.out.println(result);
    }
}

输出结果:

[hello, world, java, stream]

6.使用 iterating() 生成斐波那契数列前 10 项

代码示例:

import java.util.stream.Stream;

public class IteratingByExample {
    public static void main(String[] args) {
        Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
                .limit(10)
                .map(t -> t[0])
                .forEach(System.out::println);
    }
}

输出结果:

0
1
1
2
3
5
8
13
21
34

7.使用 empty() 使用空的 Stream

代码示例:

import java.util.stream.Stream;

public class EmptyStreamExample {
    public static void main(String[] args) {
        Stream<String> emptyStream = Stream.empty();

        System.out.println(emptyStream.count());
    }
}

输出结果:

0

8.使用 of() 创建包含一些字符串的 Stream

代码示例:

import java.util.stream.Stream;

public class OfStreamExample {
    public static void main(String[] args) {
        Stream<String> stringStream = Stream.of("hello", "world", "java", "stream");

        stringStream.forEach(System.out::println);
    }
}

输出结果:

hello
world
java
stream

9.使用 concat() 将两个字符串列表合并为一个列表

代码示例:

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

public class ConcatStreamExample {
    public static void main(String[] args) {
        List<String> list1 = Arrays.asList("hello", "world");
        List<String> list2 = Arrays.asList("java", "stream");

        Stream<String> stream1 = list1.stream();
        Stream<String> stream2 = list2.stream();

        List<String> result = Stream.concat(stream1, stream2)
                .collect(Collectors.toList());

        System.out.println(result);
    }
}

输出结果:

[hello, world, java, stream]

10.使用 unordered() 对数字列表进行排序后,使用 unordered()返回一个无序的 Stream

代码示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class UnorderedStreamExample {
    public static void main(String[] args) {
        List<Integer> numberList = Arrays.asList(1, 3, 2, 4, 10, 6, 8, 7, 9, 6);

        List<Integer> result = numberList.stream()
                .sorted()
                .unordered()
                .collect(Collectors.toList());

        System.out.println(result);
    }
}

输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

来个小坑

  感谢大佬看到这里,如果你看完觉得没问题,那么你需要反思一下了哦。好了我们可以在仔细地看看,示例10.unordered()的代码。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class UnorderedStreamExample {
    public static void main(String[] args) {
        List<Integer> numberList = Arrays.asList(1, 3, 2, 4, 10, 6, 8, 7, 9, 6);

        List<Integer> result = numberList.stream()
                .sorted()
                .unordered()
                .collect(Collectors.toList());

        System.out.println(result);
    }
}

输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  执行过程分析,首先输入了一个无序的流,然后使用sorted()对流进行排序,然后在使用unordered(),去除流的有序约束。然后输出为List,在进行打印出来。按理来说,输出的顺序应该是一个无需的,而不是有序的。

解答

  unordered()操作不会执行任何操作来显式地对流进行排序。它的作用是消除了流必须保持有序的约束,从而允许后续操作使用不必考虑排序的优化。

  对于顺序流,顺序的存在与否不会影响性能,只影响确定性。如果流是顺序的,则在相同的源上重复执行相同的流管道将产生相同的结果;如果是非顺序流,重复执行可能会产生不同的结果。

  unordered()操作,是消除了流必须保持有序的约束。并不会改变,流原有的顺序。对于并行流,放宽排序约束有时可以实现更高效的执行。在流有序时, 但用户不特别关心该顺序的情况下,使用 unordered() 明确地对流进行去除有序约束可以改善某些有状态或终端操作的并行性能。

参考

https://segmentfault.com/q/1010000017969473

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

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

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

相关文章

c++中的类继承

面向对象编程的主要目的是之一是提供可重用的代码。开发新项目&#xff0c;尤其是当项目十分庞大时&#xff0c;重用经过测试的代码比重新编写代码要好得多。使用已有的代码可以节省时间&#xff0c;由于已有的代码已被使用和测试过&#xff0c;因此有助于避免在程序中引入错误…

在Github中77k星的王炸AutoGPT,会独立思考,直接释放双手

文章目录1 前言1.1 什么是AutoGPT1.2 为什么是AutoGPT2 AutoGPT部分实例2.1 类似一个Workflow2.2 市场调研2.3 自己写播客2.4 接入客服3 安装和使用AutoGPT3.1 安装3.2 基础用法3.3 配置OpenAI的API3.4 配置谷歌API3.5 配置Pinecone API4.讨论1 前言 迄今为止&#xff0c;Gith…

枚举类注解

一、枚举类&#xff1a; 1.枚举类的使用 类的对象只有有限个&#xff0c;确定的。比如&#xff1a;星期、性别、季节 当需要定义一组常量时&#xff0c;强烈建议使用枚举类。 定义枚举类的方法&#xff1a; 一&#xff1a;jdk5.0之前&#xff0c;自定义枚举类 package com.ypl…

https访问fastdfs图片

引用&#xff1a;https://blog.csdn.net/love8753/article/details/128872320 配置nginx 的SSL模块&#xff1a;https://www.cnblogs.com/ghjbk/p/6744131.html 获取ssl证书 将ssl证书&#xff0c;拷贝到服务器的一个目录下 nginx添加 http_ssl_module 最开始安装的nginx只有 …

Spimes x5.0主题模板全开源源码/Typecho主题模板

☑️ 品牌&#xff1a;Typecho ☑️ 语言&#xff1a;PHP ☑️ 类型&#xff1a;主题模板 ☑️ 支持&#xff1a;PCWAP &#x1f389;有需要的朋友记得关赞评&#xff0c;底部分享获取&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 Spimes x5.0主题模板全开…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】 B 题 城市轨道交通列车时刻表优化问题 详细建模方案及代码实现

2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】 B 题 城市轨道交通列车时刻表优化问题 更新信息&#xff1a;2023-4-15 更新了代码 1 题目 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。 列车时刻表规定了列车在每个车站的到达和…

让手机、电视都用上Windows,微软开起了网吧

二十多年前 Windows 95 开启了家用 PC 时代。 Win XP 、Win7 … 一代代经典系统的诞生&#xff0c;Windows的市场份额彻底实现一家独大。 不过随着移动设备的兴起&#xff0c;Windows 的地位显然不如从前。 苹果、Google 都在多平台发力&#xff0c;而微软 Windows Phone 的试…

安全信息和事件管理 (SIEM)工具

组织的 IT 基础架构每天都会生成大量日志数据。这些日志包含重要信息&#xff0c;可提供有关用户行为、网络异常、系统停机、策略违规、内部威胁、法规遵从性等的见解和网络安全情报。 但是&#xff0c;在没有自动日志分析器工具的情况下手动分析这些事件日志和系统日志的任务…

2023年4月中国数据库排行榜:达梦厚积薄发夺探花,亚信、星环勇毅笃行有突破

青山遮不住&#xff0c;毕竟东流去。 生机勃勃的春天送来了2023年4月的 墨天轮中国数据库流行度排行。 本月共有263个数据库参与排名&#xff0c;排行榜前30的数据库中&#xff0c;有13个数据库崭露头角&#xff0c;处于上行趋势&#xff0c;中国数据库行业整体流行度有所增加。…

在云服务器上搭建Tomcat

这里&#xff0c;我使用的是putty和winscp。 具体步骤&#xff1a; 以下是在云服务器上搭建Tomcat的步骤&#xff1a; 1. 在本地电脑上打开winscp&#xff0c;连接到云服务器。将Tomcat程序包上传到服务器上。 2. 登录服务器&#xff0c;在终端中输入以下命令&#xff0c;解…

Nginx概述与配置

一、Nginx概述 1、Nginx的特点 一款高性能、轻量级web服务 • 稳定性高 • 系统资源消耗低高 • 对HTTP并发连接的处理能力 单台物理服务器可支持30000~50000个并发请求 2、 Nginx编译安装 • 安装支持软件 • 创建运行用户、组 • 编译安装Nginx 3、Nginx运行控制 …

mmaction行为识别模型数据集训练

参考文献 https://mmaction2.readthedocs.io/en/latest/supported_datasets.html **MMAction2 支持两种类型的数据格式&#xff1a;帧的格式和视频。**前者广泛应用于TSN等之前的项目中。当 SSD 可用时很快&#xff0c;但无法扩展到快速增长的数据集时。&#xff08;例如&#…

ESP8266 +I2C SSD1306 OLED仿数码管时钟

ESP8266 +I2C SSD1306 OLED仿数码管时钟 📌相关篇《ESP8266 + STC15+ I2C OLED带网络校时功能的定时器时钟》🎬显示效果:🔖本工程基于Arduino IDE框架下开发。🌿采用esp8266:Nodemcu📑功能组成部分 🌿屏幕驱动显示🌿时间获取🌿自定义字体📓屏幕驱动显示 🍁…

Hadoop Partition函数应用(归档)

一、实例描述 在这个实例里我们使用简单的数据集&#xff0c;里面包含多条数据&#xff0c;每条数据由姓名、年龄、性别和成绩组成。实例要求是按照如下规则归档用户。 1.找出年龄小于20岁中男生和女生的最大分数   2.找出20岁到50岁男生和女生的最大分数   3.找出50岁以上…

神器集合!这12个免费工具可以让您的工作更高效

好的工具&#xff0c;能够帮助我们更高效地完成工作&#xff0c;节省时间和精力; 节省出更多的摸鱼时间&#xff01; 本文将介绍 12 款绝佳的免费效率工具&#xff0c;这些工具可以让你事半功倍&#xff0c;提高工作效率。无论你是一名程序员、设计师、学生还是白领&#xff0c…

微观世界的详细地图:微生物生态位

是什么定义了微生物的栖息地 - 生态位&#xff1f;它是温度、湿度和营养成分等环境因素的组合。很难预测每一个因素的确切贡献度。Bas E. Dutilh研究组 基于生活在一起的微生物群体&#xff0c;重新定义了微生物生态位。无论是在温泉、人体肠道还是深海中&#xff0c;微生物几乎…

助力工业物联网,工业大数据之ODS层构建:需求分析【八】

文章目录01&#xff1a;ODS层构建&#xff1a;需求分析02&#xff1a;ODS层构建&#xff1a;创建项目环境03&#xff1a;ODS层构建&#xff1a;代码导入01&#xff1a;ODS层构建&#xff1a;需求分析 目标&#xff1a;掌握ODS层构建的实现需求 路径 step1&#xff1a;目标step…

二甲医院云his系统源码,已在多家医院全面实际使用,系统稳定可靠

云his系统源码&#xff0c;基于云计算技术的B/S架构的HIS系统源码 文末获取联系&#xff01; 基于云计算技术的B/S架构的HIS系统&#xff0c;为基层医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统…

HTML中的图片标签,真的如你认为的那么简单吗?

今天讨论一个很有意思的话题&#xff1a; HTML 中的图片真的那么简单吗&#xff1f; HTML 中的图片 <img>&#xff1a;图像嵌入元素 MDN Web Docs 地址&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img 在一开始时&#xff0c;Web 仅有文…

摄影知识整理

目录 焦距 焦距分类 对焦 相机的MF与AF 自动对焦操作 自动对焦方式 镜头防抖 防抖模式 景深 景深的作用 影响景深的因素 景深预览 摄影三大元素 光圈 光圈的作用 光圈与景深的关系 感光度&#xff08;ISO) 注意 感光度的作用 快门 B门与T门 快门速度 闪…