使用lambda过滤BufferedReader读取的压缩流行数据以省略条件判断是否可行
问题解答
完全可以使用Stream流的filter Lambda表达式替换显式的条件判断,改写后的代码如下:
private List<String> readlinesByPeriod(DPeriod period, ZipInputStream zis) throws IOException { byte[] data = SCIOUtils.readData(zis); // 用try-with-resources自动关闭流,避免资源泄漏 try (InputStream is = new ByteArrayInputStream(data); BufferedReader reader = new BufferedReader(new InputStreamReader(is, CharEncoding.ISO_8859_1))) { return reader.lines() .filter(line -> period.getCode().equals(StringUtils.substring(line, 0, 4))) .toList(); // Java 8版本不支持Stream.toList()的话,替换为.collect(Collectors.toList())即可 } }
- 链式调用逻辑完全对齐原有业务规则:逐行读取→按前4位周期编码过滤→收集符合条件的行返回,无冗余中间变量
- 省略了手动声明集合、while循环、if条件判断的样板代码,可读性更强
- 新增的自动关流逻辑修复了原有代码潜在的资源泄漏问题
补充:如果存在行长度不足4位的场景,可以在filter中增加长度校验逻辑,避免字符串截取异常,调整后的filter逻辑如下:
filter(line -> line.length() >= 4 && period.getCode().equals(StringUtils.substring(line, 0, 4)))
内容的提问来源于stack exchange,提问作者Lluis Martinez
相关产品推荐
相关产品推荐

