如何提取Java Stream中重复的字符串片段到独立方法实现代码复用
方案1:使用Stream.concat拼接流
这是最直观的实现方式,适合只需要追加1个额外元素的场景:
首先是你提取的公共字段方法示例:
// 已实现的返回公共字段列表的方法 private List<String> getBaseFields(String fieldAlias) { return List.of( fieldAlias + ".field1", fieldAlias + ".field2", fieldAlias + ".field3" ); }
改造后的原有方法:
private String firstMethod (String fieldAlias, String someName) { // 拼接公共字段流 + 额外字段流 return Stream.concat( getBaseFields(fieldAlias).stream(), Stream.of(someName + ".NAME") ) .collect(Collectors.joining(" AND ", "(", ")")); } private String secondMethod (String fieldAlias, String someValue) { return Stream.concat( getBaseFields(fieldAlias).stream(), Stream.of(someValue + ".VALUE") // 原方法此处笔误用了someName,已修正 ) .collect(Collectors.joining(" AND ", "(", ")")); }
方案2:使用flatMap合并多个流
如果后续需要追加多个额外字段,这种方式扩展性更好:
private String firstMethod (String fieldAlias, String someName) { return Stream.of( getBaseFields(fieldAlias).stream(), Stream.of(someName + ".NAME") // 后续新增其他流直接在此处追加即可 ) .flatMap(Function.identity()) // 把多个流扁平化为单个字符串流 .collect(Collectors.joining(" AND ", "(", ")")); }
注:使用flatMap(Function.identity())需要提前导入java.util.function.Function类
优化建议
你可以直接把公共部分封装为返回Stream的方法,省去每次转流的步骤:
private Stream<String> getBaseFieldStream(String fieldAlias) { return Stream.of( fieldAlias + ".field1", fieldAlias + ".field2", fieldAlias + ".field3" ); }
调用时逻辑更简洁:
private String firstMethod (String fieldAlias, String someName) { return Stream.concat( getBaseFieldStream(fieldAlias), Stream.of(someName + ".NAME") ) .collect(Collectors.joining(" AND ", "(", ")")); }
内容的提问来源于stack exchange,提问作者Gabriel Grünthaler
相关产品推荐
相关产品推荐

