You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:06:20