将StringBuilder+for循环转为Stream+Map结果不符,求排查问题
问题分析与修复方案
核心错误
你代码的关键问题在于最后一行:myPojos.stream().map(onePojo -> delegate(onePojo, stringBuilder)).toString()。这里调用的是Stream对象的toString方法,返回的是类似java.util.stream.ReferencePipeline$3@xxxxxx的对象标识字符串,根本不是你用StringBuilder拼接出来的JSON内容。
另外,用map操作修改外部的StringBuilder属于副作用操作,这不符合Stream的设计理念(虽然你说只是技术尝试,但并行流场景下还会有线程安全问题)。
修复方案
方案1:用forEach替代map(贴近原逻辑)
直接通过forEach遍历处理每个元素,最后返回StringBuilder的内容:
public String question(List<MyPojo> myPojos) { var stringBuilder = new StringBuilder(); myPojos.stream().forEach(onePojo -> delegate(onePojo, stringBuilder)); return stringBuilder.toString(); } // delegate方法保持不变 public StringBuilder delegate(MyPojo oneMyPojo, StringBuilder stringBuilder) { try { var json = objectMapper.writeValueAsString(oneMyPojo); stringBuilder.append(json).append("\n"); } catch (JsonProcessingException e) { LOGGER.warn("bad"); } return stringBuilder; }
方案2:用collect操作(符合Stream规范)
完全通过Stream的collect完成拼接,避免外部副作用:
public String question(List<MyPojo> myPojos) { return myPojos.stream() .map(this::convertToJsonWithNewLine) .collect(Collectors.joining()); } private String convertToJsonWithNewLine(MyPojo pojo) { try { return objectMapper.writeValueAsString(pojo) + "\n"; } catch (JsonProcessingException e) { LOGGER.warn("bad"); return ""; } }
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

