ⅰ. 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 - 聚合结果:
reduce、count、min、max - 布尔判断:
anymatch、allmatch、nonematch - 单元素:
findfirst、findany - 遍历/副作用:
foreach
| 方法 | 说明 | 返回值类型 | 示例 |
|---|---|---|---|
| foreach(consumer) | 遍历元素(无返回) | void | stream.foreach(system.out::println) |
| toarray() | 转数组 | object[] 或 t[] | stream.toarray() |
| collect(collector) | 收集结果 | 泛型 r(常见:list、set、map) | stream.collect(collectors.tolist()) |
| reduce(binaryoperator) | 规约(累加、累乘等) | optional | stream.reduce(integer::sum) |
| reduce(identity, binaryoperator) | 带初始值的规约 | t | stream.reduce(0, integer::sum) |
| count() | 统计数量 | long | stream.count() |
| min(comparator) | 最小值 | optional | stream.min(integer::compare) |
| max(comparator) | 最大值 | optional | stream.max(integer::compare) |
| anymatch(predicate) | 是否存在任意满足条件 | boolean | stream.anymatch(x -> x > 10) |
| allmatch(predicate) | 是否所有元素满足条件 | boolean | stream.allmatch(x -> x > 0) |
| nonematch(predicate) | 是否没有元素满足条件 | boolean | stream.nonematch(x -> x < 0) |
| findfirst() | 返回第一个元素 | optional | stream.findfirst() |
| findany() | 返回任意一个元素(并行流常用) | optional | stream.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)是一种文本模式匹配工具,常用于字符串校验、提取、替换等操作。
- 使用 regex101.com 在线测试正则
1. 基础元字符(metacharacters)
| 符号 | 含义 | 示例 | 匹配内容 |
|---|---|---|---|
. | 任意单个字符(除换行) | a.b | acb, a9b |
^ | 匹配字符串开始 | ^abc | abc123 ✅,xabc ❌ |
$ | 匹配字符串结束 | abc$ | 123abc ✅,abc123 ❌ |
* | 重复 0 次或多次 | ab*c | ac, abc, abbbc |
+ | 重复 1 次或多次 | ab+c | abc, abbbc |
? | 重复 0 次或 1 次(可选) | ab?c | ac, 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类及正则内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论