当前位置: 代码网 > it编程>编程语言>Java > JavaSE中Stream API、Optiona类及正则表达式举例详解

JavaSE中Stream API、Optiona类及正则表达式举例详解

2026年08月20日 Java 我要评论
ⅰ. stream api常见的 java 8 stream api 可以分成几类:创建、转换、中间操作、终止操作。创建操作:得到一个流对象中间操作:返回的还是一个新的流(lazy,不会真正执行)终止

ⅰ. 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)
string name = optionalname.get();

// 4. 如果为空则返回默认值
string value = optional.ofnullable(null).orelse("默认值"); // "默认值"

// 5. 用 orelseget 延迟执行
string v = optional.ofnullable(null).orelseget(() -> getdefault());

// 6. 为空则抛异常
string error = optional.ofnullable(null)
    .orelsethrow(() -> new illegalargumentexception("值不能为空"));

// 7. 转换值(map)
optional<integer> namelength = optionalname.map(string::length);

// 8. 链式调用 + 判断
string result = 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)是一种文本模式匹配工具,常用于字符串校验、提取、替换等操作。

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 中正则使用方式

字符串匹配

string regex = "^1[3-9]\\d{9}$";
boolean isvalid = pattern.matches(regex, "13812345678");

字符串提取

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

总结

到此这篇关于javase中stream api、optiona类及正则表达式的文章就介绍到这了,更多相关javase stream api、optiona类及正则内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com