Java中Stream.of()如何使用if-else实现条件化字符串拼接
实现方案
原生Collectors.joining(". ")只能固定插入分隔符,不支持根据相邻字符串内容动态调整分隔规则,不需要修改任何原始字段(可完整保留lastName自带的末尾.),直接在Stream链路中用reduce方法即可实现需求:
String result = Stream.of(student.getFirstName(), student.getLastName()) .filter(Objects::nonNull) .reduce((prev, curr) -> prev + (prev.endsWith(".") ? " " : ". ") + curr) .orElse("");
逻辑说明
- 保留原有非空过滤逻辑,所有
null字段会被直接跳过 - 拼接相邻字符串时,自动判断前一段内容的末尾是否为
.:如果是则中间只拼接空格,否则拼接原规则的.分隔符 - 全程不会修改任何原始输入的字符串内容,
lastName的原有格式完全不受影响
如果后续需要拼接的字段数量增多,担心频繁字符串拼接产生多余中间对象,可以改用自定义StringBuilder收集器的实现,逻辑完全一致,性能更好:
String result = Stream.of(student.getFirstName(), student.getLastName()) .filter(Objects::nonNull) .collect( StringBuilder::new, (sb, curr) -> { if (sb.length() == 0) { sb.append(curr); return; } if (sb.charAt(sb.length() - 1) == '.') { sb.append(' '); } else { sb.append(". "); } sb.append(curr); }, StringBuilder::append ).toString();
效果验证
对应不同输入场景的输出完全符合预期:
firstName="Zhang",lastName="San."→ 输出Zhang. San.,和原有逻辑结果一致firstName="Zhang.",lastName="San."→ 输出Zhang. San.,不会出现连续重复的.- 任意字段为
null时,剩余字段可正常拼接,不会出现多余分隔符 - 所有场景下
lastName末尾自带的.都完整保留,无修改
内容的提问来源于stack exchange,提问作者Anam Qureshi
相关产品推荐
相关产品推荐

