291. Java Stream API - 从正则表达式创建 Stream

文章目录

  • [291. Java Stream API - 从正则表达式创建 Stream](#291. Java Stream API - 从正则表达式创建 Stream)
      • [🎯 核心概念](#🎯 核心概念)
      • [📌 示例一:使用 `String.split()` 分割字符串并创建流](#📌 示例一:使用 String.split() 分割字符串并创建流)
      • [📌 示例二:使用 `Pattern.compile().splitAsStream()` 创建流](#📌 示例二:使用 Pattern.compile().splitAsStream() 创建流)
      • [📌 哪种方式更好?](#📌 哪种方式更好?)
      • [📌 为什么 `splitAsStream()` 更优?](#📌 为什么 splitAsStream() 更优?)
      • [📚 小贴士](#📚 小贴士)
      • [🎯 小测验(课堂互动)](#🎯 小测验(课堂互动))
      • [📌 总结](#📌 总结)

291. Java Stream API - 从正则表达式创建 Stream

🎯 核心概念

Java 中,Pattern 类新增了一个方法,它允许我们基于正则表达式创建一个流,直接应用于字符串。这种方式在处理字符串时非常有用,尤其是在分割字符串并对其内容进行流式处理时。

分割字符串的两种方式:
  • String.split() 方法:可以用于基于给定的分隔符将字符串分割成数组。
  • Pattern.compile().splitAsStream() 方法 :这是一个更优雅的方式,它直接返回一个 Stream<String>,不需要先创建一个数组。

📌 示例一:使用 String.split() 分割字符串并创建流

java 复制代码
String sentence = "For there is good news yet to hear and fine things to be seen";
String[] elements = sentence.split(" ");  // 使用空格分割字符串
Stream<String> stream = Arrays.stream(elements);  // 将数组转换为流
System.out.println("Words = " + stream.toList());  // 输出结果

🧾 运行此代码后,你会看到以下输出:

java 复制代码
Words = [For, there, is, good, news, yet, to, hear, and, fine, things, to, be, seen]

这段代码首先使用 String.split(" ") 方法将句子分割成一个字符串数组,然后通过 Arrays.stream(elements) 方法将数组转换为一个流,并最终将流转换为列表输出。


📌 示例二:使用 Pattern.compile().splitAsStream() 创建流

java 复制代码
String sentence = "For there is good news yet to hear and fine things to be seen";
Pattern pattern = Pattern.compile(" ");  // 编译一个正则表达式,空格作为分隔符
Stream<String> stream = pattern.splitAsStream(sentence);  // 使用正则表达式直接生成流
List<String> words = stream.toList();  // 将流收集为列表
System.out.println("Words = " + words);  // 输出结果

🧾 运行此代码,你将得到与上面的代码相同的输出:

java 复制代码
Words = [For, there, is, good, news, yet, to, hear, and, fine, things, to, be, seen]

📌 哪种方式更好?

  • 内存效率: 第二种方式使用 Pattern.compile().splitAsStream() 时,它没有创建一个中间数组,而是直接返回一个流。这意味着它节省了内存,因为没有多余的数组存储开销。
  • 性能优势: 使用 splitAsStream() 方式时,避免了不必要的数组创建,这减少了内存的消耗。在某些情况下,这也可能带来 CPU 性能的提升,特别是在处理大文件或长字符串时。

📌 为什么 splitAsStream() 更优?

  • 无中间数组: splitAsStream() 直接返回一个流,因此没有数组创建的开销。
  • 减少内存使用: 当你处理非常大的字符串时,避免创建一个完整的数组可以大大减少内存的使用。
  • 流的短路操作: 许多流操作支持短路,这意味着即使你创建了一个流,也不一定会遍历所有元素。使用 splitAsStream() 可以避免不必要的遍历和内存占用。

📚 小贴士

  • 正则表达式: Pattern.compile() 可以编译更复杂的正则表达式,使你能够处理多种不同的分隔符,比如标点符号、空格或特殊字符。
  • 流操作: 使用流时,可以结合 filter()map() 等方法进行更复杂的数据处理,进一步增强代码的灵活性和可读性。

🎯 小测验(课堂互动)

问题: 如果你希望使用正则表达式将一个字符串按逗号分隔,并且直接返回一个流,你应该使用哪种方法?

✅ A. Pattern.compile(",").splitAsStream(string)

❌ B. string.split(",")

正确答案: A


📌 总结

  • 使用 Pattern.compile().splitAsStream() 来代替 String.split(),可以提高代码的内存效率和性能,尤其是在处理大字符串时。
  • 正则表达式 提供了灵活的分隔符匹配能力,可以根据需要处理更复杂的字符串分割。
  • 使用流处理字符串数据时,推荐采用 splitAsStream() 方式,它减少了不必要的内存开销,并且能够与流的其他操作更好地配合。
相关推荐
索荣荣几秒前
SpringBoot Starter终极指南:从入门到精通
java·开发语言·springboot
独断万古他化几秒前
【Spring 事务】事务隔离级别与事务传播机制:从理论到业务落地实操
java·后端·spring·事务隔离·事务传播
苏涵.2 分钟前
三种工厂设计模式
java
lly2024068 分钟前
HTML DOM 访问
开发语言
落羽的落羽8 分钟前
【Linux系统】文件IO:理解文件描述符、重定向、缓冲区
linux·服务器·开发语言·数据结构·c++·人工智能·机器学习
嗯嗯**10 分钟前
Neo4j学习3:Java连接图库并执行CQL
java·学习·spring·neo4j·图数据库·驱动·cql
洛阳纸贵10 分钟前
JAVA高级工程师--Springboot集成ES、MySQL同步ES的方案、ES分片副本、文档及分片规划
java·spring boot·elasticsearch
.小墨迹15 分钟前
apollo中速度规划的s-t图讲解【针对借道超车的问题】
开发语言·数据结构·c++·人工智能·学习
小龙报16 分钟前
【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题
c语言·开发语言·数据结构·c++·算法·leetcode·链表
阿猿收手吧!18 分钟前
【C++】C++原子类型隐式转换解析
java·c++