当前位置: 首页 > news >正文

【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}

http://www.cnnetsun.cn/news/134213.html

相关文章:

  • 3分钟玩转树莓派NFC读卡器:MFRC522-python极速上手攻略
  • MuJoCo无头渲染完全指南:告别图形界面的物理仿真可视化
  • 【PCL点云配准】ICP收敛判断
  • Android混合开发终极指南:AgentWeb实现原生与Web的无缝融合
  • 【程序员必学】智能体(Agent)技术:大模型落地的核心载体与应用【收藏指南】
  • 学生综合测评|基于springboot + vue学生综合测评管理系统(源码+数据库+文档)
  • Waydroid完整使用指南:在Linux系统上快速运行Android应用
  • 基于SSM的一线式酒店管理系统-计算机毕业设计源码+LW文档分享
  • 异常处理框架设计:全局异常捕获与统一错误码
  • 批量压缩对象存储中视频
  • ytDownloader视频下载全攻略:从入门到精通的完整指南
  • OPC Data Client+MQTT协议:工业数据连接与传输一体化解决方案
  • 【雷达检测】基于Swerling目标模型的雷达信号检测附Matlab代码和报告
  • 分布式数据集成平台终极指南:可视化数据同步与大数据处理完整教程
  • 储能辅助火电机组二次调频控制策略及容量优化配置研究Simulink实现
  • I2C与SPI
  • 配电网中的拥塞管理Congestion Management in Distribution Networks
  • 中华人民共和国劳动合同法
  • Kotaemon HTTPS 部署教程:SSL证书配置全流程
  • 【dz-956】基于单片机的公交车系统
  • SECS/GEM通信实战指南:Python实现半导体设备智能监控系统
  • Chrome测试版本128.0.6613.137:跨平台自动化测试的终极解决方案
  • CMA/CNAS软件测评机构:【Gatling数据库性能关联测试JDBC连接和SQL执行时间监控】
  • 微信自动化助手:零成本Windows部署全攻略
  • PCB激光钻孔:CO₂激光VS紫外激光,谁更胜一筹?
  • 数据质量革命:Great Expectations如何重塑企业数据治理格局
  • AI如何帮你快速解决SQL Server连接问题
  • torch.matmul性能优化:比传统方法快10倍的技巧
  • OpenModScan 完全指南:掌握工业自动化调试的必备利器
  • 深度学习压缩技术实战:CompressAI框架的5大核心应用场景