news 2026/6/9 22:04:58

【JavaSE】Stream API Optiona类 正则表达式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【JavaSE】Stream API Optiona类 正则表达式

文章目录

  • Ⅰ. Stream API
    • 一、Stream 创建方式
    • 二、中间操作(返回新的 Stream,可链式调用)
    • 三、终止操作(触发流处理,返回具体结果)
  • Ⅱ. Optional 类
  • Ⅲ. 两者结合的一个例子
  • Ⅳ. 正则表达式
    • 🧠 1. 基础元字符(Metacharacters)
    • 📚 2. 常用转义字符
    • 🔐 3. 常用校验正则(可直接用于 Java)
      • ✅ 邮箱
      • ✅ 手机号(中国大陆)
      • ✅ 身份证(大陆 18位)
      • ✅ 密码强度(6-12位,字母或数字)
      • ✅ 密码必须包含大小写字母 + 数字(6-16位)
      • ✅ URL 校验
    • 🧪 4. Java 中正则使用方式
      • 🔍 字符串匹配
      • 🔎 字符串提取

Ⅰ. Stream API

常见的Java 8 Stream API可以分成几类:创建、转换、中间操作、终止操作。

  • 创建操作:得到一个流对象
  • 中间操作:返回的还是一个新的流(lazy,不会真正执行)
  • 终止操作:才会触发整个流水线的执行,产生结果(数值、集合、Optional 等)
Stream<Integer>s=Stream.of(1,2,3,4).filter(x->x>2)// 中间操作,返回流.map(x->x*10);// 中间操作,返回流// 到这里还没执行,s 只是描述了一条“流水线”List<Integer>list=s.collect(Collectors.toList());// 终止操作,真正执行System.out.println(list);// [30, 40]

一、Stream 创建方式

方法说明示例
Stream.of(T…)由一组元素创建Stream.of(1,2,3)
Arrays.stream(array)由数组创建Arrays.stream(new int[]{1,2,3})
Collection.stream()由集合创建list.stream()
Collection.parallelStream()并行流list.parallelStream()
Stream.iterate(seed, f)无限流(迭代生成)Stream.iterate(1, n -> n+1)
Stream.generate(Supplier)无限流(供应生成)Stream.generate(Math::random)

二、中间操作(返回新的 Stream,可链式调用)

方法说明示例
filter(Predicate)过滤元素stream.filter(x -> x > 10)
map(Function)映射/转换stream.map(String::length)
flatMap(Function)扁平化映射stream.flatMap(s -> Arrays.stream(s.split(“,”)))
distinct()去重stream.distinct()
sorted()自然排序stream.sorted()
sorted(Comparator)自定义排序stream.sorted((a,b)->b-a)
limit(n)截取前 n 个stream.limit(5)
skip(n)跳过前 n 个stream.skip(3)
peek(Consumer)调试/查看中间值stream.peek(System.out::println)

三、终止操作(触发流处理,返回具体结果)

  • 集合结果collect
  • 聚合结果reducecountminmax
  • 布尔判断anyMatchallMatchnoneMatch
  • 单元素findFirstfindAny
  • 遍历/副作用forEach
方法说明返回值类型示例
forEach(Consumer)遍历元素(无返回)voidstream.forEach(System.out::println)
toArray()转数组Object[] 或 T[]stream.toArray()
collect(Collector)收集结果泛型 R(常见:List、Set、Map)stream.collect(Collectors.toList())
reduce(BinaryOperator)规约(累加、累乘等)Optionalstream.reduce(Integer::sum)
reduce(identity, BinaryOperator)带初始值的规约Tstream.reduce(0, Integer::sum)
count()统计数量longstream.count()
min(Comparator)最小值Optionalstream.min(Integer::compare)
max(Comparator)最大值Optionalstream.max(Integer::compare)
anyMatch(Predicate)是否存在任意满足条件booleanstream.anyMatch(x -> x > 10)
allMatch(Predicate)是否所有元素满足条件booleanstream.allMatch(x -> x > 0)
noneMatch(Predicate)是否没有元素满足条件booleanstream.noneMatch(x -> x < 0)
findFirst()返回第一个元素Optionalstream.findFirst()
findAny()返回任意一个元素(并行流常用)Optionalstream.findAny()

Ⅱ. Optional 类

Optional<T>是一个可能包含值也可能为空的容器对象,它替代了传统的null返回,用更安全、明确、链式的方式处理值的存在或缺失。

常用方法如下所示:

方法名返回值说明
of(T value)Optional创建非空的 Optional,传 null 会抛异常
ofNullable(T value)Optional创建 Optional,允许 null
empty()Optional创建一个空的 Optional
isPresent()boolean判断是否有值(true/false)
ifPresent(Consumer)void如果有值就执行某个操作
get()T获取值,若为空会抛 NoSuchElementException
orElse(T other)T若有值则返回,否则返回默认值(总会执行传入的表达式,无论是否为空)
orElseGet(Supplier)T若有值返回,否则调用函数获取默认值(只有为空才会执行传入的表达式)
orElseThrow()T若为空抛异常(默认抛 NoSuchElementException)
orElseThrow(Supplier)T若为空抛自定义异常
map(Function)Optional对值做转换操作(包装成新的 Optional)
flatMap(Function)Optional链式调用,避免嵌套 Optional
filter(Predicate)Optional判断值是否满足条件,不满足则变成 empty

注意事项:

  • 不要用get()随意取值,如果值为 null 会直接抛异常。
  • ✅ 推荐始终使用orElse/ifPresent等方法来处理 Optional。
// 创建一个optional对象Optional<String>optionalName=Optional.of("lirendada");// 1. 是否有值optionalName.isPresent();// true// 2. 如果有值就打印optionalName.ifPresent(name->System.out.println("Name: "+name));// 3. 获取值(不推荐直接用 get)Stringname=optionalName.get();// 4. 如果为空则返回默认值Stringvalue=Optional.ofNullable(null).orElse("默认值");// "默认值"// 5. 用 orElseGet 延迟执行Stringv=Optional.ofNullable(null).orElseGet(()->getDefault());// 6. 为空则抛异常Stringerror=Optional.ofNullable(null).orElseThrow(()->newIllegalArgumentException("值不能为空"));// 7. 转换值(map)Optional<Integer>nameLength=optionalName.map(String::length);// 8. 链式调用 + 判断Stringresult=Optional.of("lirendada").filter(s->s.length()>5).map(String::toUpperCase).orElse("太短了");// 输出:LIRENDADA

Ⅲ. 两者结合的一个例子

findFirst()是 Java Stream 中的一个终止操作(Terminal Operation),作用是:

在过滤或处理后的流中,返回“第一个匹配的元素”(包装在Optional中)。

如果不用findFirst()结束的话,就会得到一个无限的 Stream 流对象,而不是最终的PrizeEntity元素。

Optional<PrizeEntity>optionalPrizeDTO=prizes.stream().filter(y->y.getId().equals(x.getPrizeId())).findFirst();// 如果 optionalPrizeDTO 不为空,执行该方法optionalPrizeDTO.ifPresent(y->{// 设置详细属性});

Ⅳ. 正则表达式

正则表达式(Regular Expression)是一种文本模式匹配工具,常用于字符串校验、提取、替换等操作。

  • 使用 regex101.com 在线测试正则

🧠 1. 基础元字符(Metacharacters)

符号含义示例匹配内容
.任意单个字符(除换行)a.bacb,a9b
^匹配字符串开始^abcabc123✅,xabc
$匹配字符串结束abc$123abc✅,abc123
*重复 0 次或多次ab*cac,abc,abbbc
+重复 1 次或多次ab+cabc,abbbc
?重复 0 次或 1 次(可选)ab?cac,abc
[]匹配一个字符[abc]a,b,c
[^]匹配不在集合内的字符[^0-9]非数字
{n}重复 n 次a{3}aaa
{n,}至少重复 n 次a{2,}aa,aaa
{n,m}重复 n~m 次a{2,4}aa,aaa,aaaa
```abc
()分组(abc)+匹配多个abc

📚 2. 常用转义字符

符号含义示例匹配内容
\d数字[0-9]\d{3}123
\D非数字\D+abc
\w单词字符[a-zA-Z0-9_]\w+abc_123
\W非单词字符\W+#@!
\s空白字符(空格、Tab、换行)\s+" "\t\n
\S非空白字符\S+abc123
\b单词边界\bword\b匹配独立单词word
\B非单词边界\Bword\B中间位置xwordx

🔐 3. 常用校验正则(可直接用于 Java)

✅ 邮箱

^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$

✅ 手机号(中国大陆)

^1[3-9]\d{9}$

✅ 身份证(大陆 18位)

^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$

✅ 密码强度(6-12位,字母或数字)

^[A-Za-z0-9]{6,12}$

✅ 密码必须包含大小写字母 + 数字(6-16位)

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{6,16}$

✅ URL 校验

^(https?://)?([a-zA-Z0-9.-]+)(:[0-9]{1,5})?(/.*)?$

🧪 4. Java 中正则使用方式

🔍 字符串匹配

Stringregex="^1[3-9]\\d{9}$";booleanisValid=Pattern.matches(regex,"13812345678");

🔎 字符串提取

Patternpattern=Pattern.compile("\\d+");Matchermatcher=pattern.matcher("abc123xyz456");while(matcher.find()){System.out.println(matcher.group());// 输出 123 和 456}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 19:54:59

原圈科技AI市场舆情分析平台在文旅行业的实战价值与应用洞察

摘要&#xff1a;原圈科技的AI市场舆情分析平台在文旅行业被普遍视为高价值选择&#xff0c;推荐度突出。该结论建立在综合技术能力、数据融合水平、行业适配度、服务稳定性和客户口碑等多维表现。平台实现了内外数据打通、深度场景逻辑推理与自动化洞察&#xff0c;能有效支撑…

作者头像 李华
网站建设 2026/6/7 2:26:43

灵活用工平台实践经验分享:亲测效果显著

灵活用工平台实践经验分享&#xff1a;亲测效果显著行业痛点分析当前&#xff0c;灵活用工平台在快速发展的同时也面临着诸多技术挑战。其中&#xff0c;最主要的问题包括算薪准确度低、系统稳定性差以及用户数据安全问题。这些问题不仅影响了用户体验&#xff0c;还增加了企业…

作者头像 李华
网站建设 2026/6/7 0:38:16

labelCloud:高效3D点云标注工具实战指南

labelCloud&#xff1a;高效3D点云标注工具实战指南 【免费下载链接】labelCloud 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 在自动驾驶和机器人视觉领域&#xff0c;3D点云数据的准确标注是模型训练的关键环节。面对复杂的3D场景和多样的物体形态&…

作者头像 李华
网站建设 2026/6/9 0:22:14

Windows系统完美使用Mac触控板:跨平台触控体验终极指南

Windows系统完美使用Mac触控板&#xff1a;跨平台触控体验终极指南 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad …

作者头像 李华
网站建设 2026/6/7 1:56:29

基于关键词匹配的文本分类系统开题报告

石家庄信息工程职业学院计算机应用系毕业设计开题报告2022 级 计算机应用 系 人工智能技术应用 专业 4 班学生姓名学号32220120437设 计题 目基于关键词匹配的文本分类系统指导教师马铭轩所属系别计算机应用系所 属教研室人工智能教研室&#xff08;要求包含项目的背景、…

作者头像 李华
网站建设 2026/6/8 12:03:47

27考研,英语,数学,政治推荐哪些线上课?

由于我们只专注于考研数学&#xff0c;所以&#xff0c;就来说一说我们的考研数学吧。 和通常的考研数学辅导是视频形式不一样&#xff0c;「荒原之梦考研数学」提供了大量原创的图文版考研数学资料&#xff0c;这些资料从实战的角度出发&#xff0c;对于知识点和题目的解析并…

作者头像 李华