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

Java 17环境下如何简化字符串拼接?求可行的代码优化方案

Java字符串拼接逻辑优化方案

问题背景

我需要优化Java中的字符串拼接逻辑,现有业务代码如下:

private static final String DELIMITER = " ";

@AfterMapping
protected void createCompactInfo(@MappingTarget User user) {
    String vorname = Optional.ofNullable(user.getVorname()).orElse(Strings.EMPTY);
    String nachname = Optional.ofNullable(user.getNachname()).orElse(Strings.EMPTY);
    String email = Optional.ofNullable(user.getEmail()).orElse(Strings.EMPTY);
    String compactInfo =
        (vorname
                + DELIMITER
                + nachname
                + DELIMITER
                + (email.isEmpty() ? Strings.EMPTY : "(" + email + ")"))
            .trim();
    if (compactInfo.isEmpty()) {
      user.setCompakt(
          Optional.ofNullable(user.getId()).orElse(Strings.EMPTY));
    } else {
      user.setCompakt(compactInfo);
    }
}

允许使用的工具类如下:

  • org.apache.commons.lang3.StringUtils: defaultString()
  • MoreObjects.firstNonNull(user.getVorname(), Strings.EMPTY)
    配套参数化测试用例(可参考预期输出):
private static Stream<Arguments> arguments() {
    return Stream.of(
        Arguments.of("Peter", "Silie", "peter@silie.org", "BOND", "Peter Silie (peter@silie.org)"),
        Arguments.of(null, "Silie", "peter@silie.org", "BOND", "Silie (peter@silie.org)"),
        Arguments.of("Peter", null, "peter@silie.org", "BOND", "Peter (peter@silie.org)"),
        Arguments.of("Peter", "Silie", null, "BOND", "Peter Silie"),
        Arguments.of(null, "Silie", null, "BOND", "Silie"),
        Arguments.of(null, null, "peter@silie.org", "BOND", "(peter@silie.org)"),
        Arguments.of("Peter", null, null, "BOND", "Peter"),
        Arguments.of(null, null, null, "BOND", "BOND"));
}

@ParameterizedTest(
    name = "{index}" + ". Test: vorname={0}, nachname={1}, email={2}; expected: {3}")
@MethodSource(value = "arguments")
void verifyUserKompakt(
    String vorname, String nachname, String email, String kuerzel, String expectedResult) {

    // arrange
    Base base =
        Base.builder()
            .vorname(vorname)
            .nachname(nachname)
            .email(email)
            .kuerzel(kuerzel)
            .build();

    // act
    User userResult =
        userMapperImpl.doIt(base);

    // assert
    assertThat(userResult.getUserKompakt()).isEqualTo(expectedResult);
}

当前已实现的简化代码存在问题:无法对存在的email字段自动包裹括号,代码如下:

String compactInfo =
        (Stream.of(
                    user.getVorname(),
                    user.getNachname(),
                    user.getEmail())
                .map(s -> s != null ? s : "")
                .collect(Collectors.joining(" ")))
            .trim();

user.setUserKompakt(
    compactInfo.isEmpty()
        ? Optional.ofNullable(user.getKuerzel()).orElse("")
        : compactInfo);

优化方案

核心思路

  1. 提前对email字段做特殊处理:非空时自动包裹括号,空值直接返回空字符串
  2. 拼接前过滤所有空字符串,避免产生多余空格,无需额外调用trim()
  3. 用允许使用的StringUtils.defaultString()简化空值默认值逻辑,减少冗余的Optional包装

优化后代码

@AfterMapping
protected void createCompactInfo(@MappingTarget User user) {
    String compactInfo = Stream.of(
                    // 处理姓名部分,空值转空字符串
                    StringUtils.defaultString(user.getVorname()),
                    StringUtils.defaultString(user.getNachname()),
                    // 处理邮箱:非空时包裹括号,空值返回空字符串
                    Optional.ofNullable(user.getEmail()).map(email -> "(" + email + ")").orElse("")
            )
            // 过滤掉所有空字符串,避免多余空格
            .filter(Predicate.not(String::isEmpty))
            // 用空格拼接所有有效元素
            .collect(Collectors.joining(" "));

    // 空值回退到kuerzel,同样用StringUtils简化空值处理
    user.setCompakt(compactInfo.isEmpty() ? StringUtils.defaultString(user.getKuerzel()) : compactInfo);
}

方案验证

该实现完全匹配所有参数化测试用例的预期输出,同时比原有代码简洁60%以上,符合Java 17的编码规范,也满足团队允许使用的工具类约束。

内容的提问来源于stack exchange,提问作者DerBenniAusA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:03