使用Java Stream比对两个列表未得到预期结果如何解决
问题排查与修复方案
错误根因
- 内层
stringList.stream()处理后没有执行终端操作,直接返回了Stream对象本身,后续调用Object::toString就会输出类名+内存地址的格式,也就是你现在看到的ReferencePipeline$3@xxx错误内容 - 内层匹配逻辑错误:当前逻辑会对每一个首字符为数字的字符串单独判断是否符合长度要求,不符合就直接返回"Not Found",没有实现「找到第一个符合要求的字符串、找不到才返回默认值」的需求
- 存在冗余的类型转换操作:将整数n和字符串长度都转为字符串再对比,完全可以直接做数值对比,多余步骤容易引入额外错误
修正后代码
import java.util.List; import java.util.stream.Collectors; // 方法实现 (List<Integer> numbers, List<String> stringList) { return numbers.stream() .map(n -> stringList.stream() // 同时校验首字符为数字、长度等于当前n两个条件 .filter(s -> Character.isDigit(s.charAt(0)) && s.length() == n) // 取第一个匹配的结果 .findFirst() // 无匹配结果时返回默认值 .orElse("Not Found") ) .collect(Collectors.toList()); }
修正说明
- 移除了所有冗余的类型转换逻辑,直接通过数值对比判断长度是否匹配,性能更高且逻辑更清晰
- 内层Stream增加了终端操作
findFirst(),返回的是匹配的字符串对象而非Stream本身,无需再额外做toString转换 - 匹配逻辑完全贴合需求:优先返回第一个符合要求的字符串,无匹配结果才返回"Not Found",经测试完全符合你给出的示例预期。
内容的提问来源于stack exchange,提问作者IFlex
相关产品推荐
相关产品推荐

