Java如何用简洁方式实现带行长度限制的字符串列表逗号拼接
核心说明
单独使用String.join无法直接实现你的需求,它只能固定插入分隔符,不支持根据累计行长度动态插入换行的分支逻辑。你可以通过Stream API自定义收集器,或者优化原有循环写法来得到更简洁、健壮的实现。
代码实现
1. Stream API版本
private static String joinLabels(List<String> strings) { return strings.stream().collect( () -> new Object() { final StringBuilder sb = new StringBuilder(); int rowLength = 0; }, (acc, str) -> { // 先算上分隔符的长度 if (!acc.sb.isEmpty()) { acc.sb.append(", "); acc.rowLength += 2; } acc.rowLength += str.length(); // 超出长度换行 if (acc.rowLength > 40) { acc.sb.append("\n"); acc.rowLength = str.length(); } acc.sb.append(str); }, (a, b) -> { throw new UnsupportedOperationException("该实现不支持并行流"); } ).sb.toString(); }
2. 优化循环版本
如果不需要用Stream,原有循环也可以简化掉最后截取字符串的操作,性能更好:
private static String joinLabels(List<String> strings) { int rowLength = 0; StringBuilder sb = new StringBuilder(); for (String str : strings) { if (!sb.isEmpty()) { sb.append(", "); rowLength += 2; } rowLength += str.length(); if (rowLength > 40) { sb.append("\n"); rowLength = str.length(); } sb.append(str); } return sb.toString(); }
注意:你原有实现没有把分隔符
,的2个字符长度计入行长度统计,实际每行长度会比预期多2*(当前行元素个数-1),上面的两个实现都修正了这个问题。
内容的提问来源于stack exchange,提问作者Valeriy K.
相关产品推荐
相关产品推荐

