Java 8如何实现字符串语句与列表元素匹配并返回计算后索引
Java 8 实现字符串匹配返回索引+长度的最优方案
需求回顾
你当前需要实现的逻辑为:
- 校验目标句子是否包含待匹配列表中的任意元素
- 匹配成功后返回该元素在句子中的起始索引加上元素自身长度,多匹配场景默认取最后一个匹配结果,无匹配返回0
核心实现代码
和原有for循环逻辑完全对齐的Java 8 Stream实现如下:
// 待匹配列表 List<String> tobeMatched = new ArrayList<>(Arrays.asList("History","Geography")); // 目标句子 String sentence1 = "Chapter History is a boring one"; int result = tobeMatched.stream() // 过滤出句子中包含的匹配项 .filter(sentence1::contains) // 映射为 起始索引+元素长度 的int值 .mapToInt(matchStr -> sentence1.indexOf(matchStr) + matchStr.length()) // 保留最后一个匹配结果,和原for循环逻辑完全一致 .reduce((pre, cur) -> cur) // 无匹配时默认返回0 .orElse(0);
上述代码运行后输出结果为14,和示例预期一致。
优化说明
- 若业务要求取第一个匹配到的结果,可以将
reduce((pre, cur) -> cur)替换为findFirst(),无需遍历完整个列表,性能更高:int result = tobeMatched.stream() .filter(sentence1::contains) .mapToInt(matchStr -> sentence1.indexOf(matchStr) + matchStr.length()) .findFirst() .orElse(0); - 采用
mapToInt直接处理基本类型数值,避免了包装类自动拆箱的性能开销,是Stream处理数值场景的最优写法 - 无匹配场景的返回值可根据业务需求自定义,直接修改
orElse()方法的入参即可
内容的提问来源于stack exchange,提问作者arsh
相关产品推荐
相关产品推荐

