深入理解Java 8的流式API:简化代码,提升效率

在这里插入图片描述

文章目录

  • 深入理解Java 8的流式API:简化代码,提升效率
    • 一、流 Stream
    • 二、Int | Long | Double Stream
    • 三、收集器 Collectors

深入理解Java 8的流式API:简化代码,提升效率

Java 8引入了Stream API,它提供了一种新的抽象,可以更方便地对集合进行操作和处理。

想深入了解Stream流的小伙伴可以看看我以前的源码文章

1、 深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘_jdk中的流-CSDN博客

2、 Java流操作解析:深度剖析中间操作、终端操作与并行处理机制_流操作 中间操作有哪些-CSDN博客

一、流 Stream

Stream API允许我们以一种声明性的方式处理数据,支持函数式编程风格。

String流主要特性和用法

  1. 创建流
    • 从集合创建:通过集合的stream()方法或parallelStream()方法来创建流。
    • 从数组创建:使用Arrays.stream(array)方法。
    • 使用静态工厂方法:如Stream.of()IntStream.range()等。
  2. 中间操作
    • filter(Predicate):根据条件过滤流中的元素。
    • map(Function):将流中的每个元素映射为另一个元素。
    • sorted():对流进行排序。
    • distinct():去除流中重复的元素。
    • limit(long):限制流中元素的数量。
  3. 终端操作
    • forEach(Consumer):对流中的每个元素执行操作。
    • collect(Collectors):将流元素归约和汇总成一个值,如List、Set、Map等。
    • reduce():归约操作,可以将流中的元素反复结合起来,得到一个值。
    • min()max():找出流中的最小和最大值。
    • count():返回流中元素的总数。
    • anyMatch(), allMatch(), noneMatch():检查流中是否存在满足条件的元素。

如何使用Java 8的Stream API来操作集合

public static void main(String[] args) {List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");// 打印非空字符串的数量:使用`filter`方法过滤出非空字符串,然后使用`count`方法获取数量long count = strings.stream().filter(string -> !string.isEmpty()).count();System.out.println("非空字符串数量:" + count);// 打印非空字符串的列表:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.toList())`将结果收集为ListList<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());System.out.println("非空字符串列表:" + filtered);// 使用逗号连接非空字符串:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.joining(", "))`连接成一个字符串String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));System.out.println("连接后的字符串:" + mergedString);// 获取最长的字符串:使用`max`方法找到最长的字符串,如果找不到则返回空字符串String longestString = strings.stream().max((s1, s2) -> s1.length() - s2.length()).orElse("");System.out.println("最长的字符串:" + longestString);}

二、Int | Long | Double Stream

IntStreamLongStreamDoubleStream 是基本类型的流,提供了对整数、长整数和双精度浮点数的高效处理。

IntStream 的元素类型为 int

  • 创建方式
    • range(int startInclusive, int endExclusive):创建一个范围在 [startInclusive, endExclusive) 内的 IntStream
    • rangeClosed(int startInclusive, int endInclusive):创建一个范围在 [startInclusive, endInclusive] 内的 IntStream
    • of(int... values):从一组整数值创建一个 IntStream
  • 常用方法
    • sum():对流中的所有整数求和。
    • average():计算流中所有整数的平均值。
    • min()max():找出流中的最小和最大值。
    • forEach(IntConsumer action):对流中的每个整数执行指定操作。

LongStream 的元素类型为 long

  • 创建方式
    • range(long startInclusive, long endExclusive):创建一个范围在 [startInclusive, endExclusive) 内的 LongStream
    • rangeClosed(long startInclusive, long endInclusive):创建一个范围在 [startInclusive, endInclusive] 内的 LongStream
    • of(long... values):从一组长整数值创建一个 LongStream
  • 常用方法
    • sum():对流中的所有长整数求和。
    • average():计算流中所有长整数的平均值。
    • min()max():找出流中的最小和最大值。
    • forEach(LongConsumer action):对流中的每个长整数执行指定操作。

DoubleStream 的元素类型为 double

  • 创建方式
    • of(double... values):从一组双精度浮点数值创建一个 DoubleStream
    • range(double startInclusive, double endInclusive):创建一个在指定范围内的 DoubleStream
  • 常用方法
    • sum():对流中的所有双精度浮点数求和。
    • average():计算流中所有双精度浮点数的平均值。
    • min()max():找出流中的最小和最大值。
    • forEach(DoubleConsumer action):对流中的每个双精度浮点数执行指定操作。

使用 IntStreamLongStreamDoubleStream 基本的操作

 public static void main(String[] args) {// IntStream IntStream.range(1, 5).forEach(System.out::print);  // 输出:1234System.out.println();int sum = IntStream.of(1, 2, 3, 4, 5).sum();  // 计算总和:15System.out.println("Sum of integers: " + sum);// LongStream long max = LongStream.rangeClosed(1, 10).max().orElse(0);  // 找出最大值:10System.out.println("Max of long integers: " + max);// DoubleStreamdouble average = DoubleStream.of(1.5, 2.5, 3.5, 4.5).average().orElse(0.0);  // 计算平均值:3.0System.out.println("Average of doubles: " + average);}

三、收集器 Collectors

收集器(Collectors)用于将流的元素累积到集合中,或者进行聚合操作。在使用流进行数据处理时,收集器是非常有用的工具,它们能够简化代码并提高效率。

常用的收集器及其用法:

  1. toList()

    • 将流中的元素收集到一个列表中。
    List<String> list = stream.collect(Collectors.toList());
    
  2. toSet()

    • 将流中的元素收集到一个集合(集合元素不重复)中。
    Set<String> set = stream.collect(Collectors.toSet());
    
  3. toMap()

    • 将流中的元素根据指定的 keyMapper 和 valueMapper 转换为 Map。
    Map<Integer, String> map = stream.collect(Collectors.toMap(String::length, Function.identity()));
    
  4. joining()

    • 连接流中的元素成为一个字符串。
    String result = stream.collect(Collectors.joining(", "));
    
  5. groupingBy()

    • 根据某个属性对流中的元素进行分组,生成一个 Map,键为属性,值为对应属性的元素列表。
    Map<Integer, List<String>> groupedByLength = stream.collect(Collectors.groupingBy(String::length));
    
  6. partitioningBy()

    • 根据一个条件将流中的元素分为两组,生成一个 Map,键为 true/false,值为满足条件的元素列表。
    Map<Boolean, List<String>> partitioned = stream.collect(Collectors.partitioningBy(s -> s.length() > 3));
    
  7. summarizingInt() / summarizingDouble() / summarizingLong()

    • 统计流中元素的汇总信息,如最大值、最小值、平均值、总和等。
    IntSummaryStatistics stats = stream.collect(Collectors.summarizingInt(String::length));

如何将一个字符串流收集成一个列表,并按长度分组

public static void main(String[] args) {List<String> words = Arrays.asList("apple", "banana", "grape", "pear", "orange");// 将流中的元素收集到一个列表中List<String> wordList = words.stream().collect(Collectors.toList());System.out.println("List of words: " + wordList);// 根据字符串长度分组Map<Integer, List<String>> groupedByLength = words.stream().collect(Collectors.groupingBy(String::length));System.out.println("Words grouped by length: " + groupedByLength);}

智者的梦再美,也不如愚人实干的脚印

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaDS —— 二叉树

树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有…

SpringCloud------Sentinel(微服务保护)

目录 雪崩问题 处理方式!!!技术选型 Sentinel 启动命令使用步骤引入依赖配置控制台地址 访问微服务触发监控 限流规则------故障预防流控模式流控效果 FeignClient整合Sentinel线程隔离-------故障处理线程池隔离和信号量隔离​编辑 两种方式优缺点设置方式 熔断降级-----…

tinymce富文本支持word内容同时粘贴文字图片上传 vue2

效果图 先放文件 文件自取tinymce: tinymce富文本简单配置及word内容粘贴图片上传 封装tinymce 文件自取&#xff1a;tinymce: tinymce富文本简单配置及word内容粘贴图片上传 页面引用组件 <TinymceSimplify refTinymceSimplify v-model"knowledgeBlockItem.content…

用html做python教程01

用html做python教程01 前言开肝构思实操额外修饰更换字体自适应 最后 前言 今天打开csdn的时候&#xff0c;看见csdn给我推荐了一个python技能书。 说实话&#xff0c;做得真不错。再看看我自己&#xff0c;有亿点差距&#x1f61f;。 开肝 先创建一个文件&#xff0c;后缀…

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

【linux】Shell脚本中basename和dirname的详细用法教程

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Python爬虫-淘宝搜索热词数据

前言 本文是该专栏的第70篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细针对“亚马逊Amazon搜索热词”数据采集的详细介绍,对此感兴趣的同学,可以往前翻阅《Python爬虫-某跨境电商(AM)搜索热词》进行查看。 而在本文,笔者将以淘宝为例,获取…

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件&#xff1a;(从官网获取或者网上) 1、zlib-1.2.3.tar.gz &#xff1a;通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…

n7.Nginx 第三方模块

Nginx 第三方模块 第三模块是对nginx 的功能扩展&#xff0c;第三方模块需要在编译安装Nginx 的时候使用参数–add-modulePATH指定路径添加&#xff0c;有的模块是由公司的开发人员针对业务需求定制开发的&#xff0c;有的模块是开 源爱好者开发好之后上传到github进行开源的模…

注册安全分析报告:东方航空

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

移动硬盘在苹果电脑上使用后在windows中无法读取 Win和Mac的硬盘怎么通用

在日益普及的跨平台工作环境中&#xff0c;苹果电脑与Windows PC之间的数据交换成为日常需求。然而&#xff0c;用户常面临一个困扰&#xff1a;为何苹果电脑的硬盘能在macOS下流畅运行&#xff0c;却在Windows系统中变得“水土不服”&#xff1f;这一问题核心在于硬盘格式的不…

IP转接服务的重要性及其应用

在现今互联网高度发达的时代&#xff0c;IP转接服务的重要性日益凸显。对于家庭和企业而言&#xff0c;它不仅是连接互联网的桥梁&#xff0c;更是确保网络稳定、高效运行的关键。本文将深入探讨IP转接服务的核心意义及其在互联网世界中的应用。 IP转接服务&#xff0c;简而言之…

QT小细节

QT小细节 1 QTextToSpeech1.1 cmake1.2 qmake 2 QChartView QT6 6.7.2 1 QTextToSpeech 从下图可以看到&#xff0c;分别使用qmake或者cmake编译情况下的&#xff0c;QTextToSpeech的使用方法 QTextToSpeech官方链接&#xff0c;也可以直接在QT Creator的帮助中搜索 1.1 cma…

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说&#xff1a;“屏幕不够&#xff0c;滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不&#xff0c;从 SwiftUI 5.0&#xff08;iOS 17&#xff09;开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP &#xff08; Trivial File Transfer Protocol &#xff09;即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

钡铼分布式I/O系统边缘计算Modbus,MQTT,OPC UA耦合器BL206

BL206系列耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;支持Modbus&#xff0c;MQTT&#xff0c;OPC UA协议&#xff0c;可以快速接入现场PLC、DCS、PAS、MES、Ignition和SCADA以及ERP系统&#xff0c;同时…

八股文之java基础

jdk9中对字符串进行了一个什么优化&#xff1f; jdk9之前 字符串的拼接通常都是使用进行拼接 但是的实现我们是基于stringbuilder进行的 这个过程通常比较低效 包含了创建stringbuilder对象 通过append方法去将stringbuilder对象进行拼接 最后使用tostring方法去转换成最终的…

Pycharm 安装与使用

PyCharm的安装与使用 一、什么是PyCharm PyCharm是由JetBrains开发的专业Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供智能代码补全、语法高亮和代码导航等编辑功能。它具有强大的调试工具和内置版本控制系统支持&#xff0c;方便代码管理和协作。PyCharm…