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);
优化方案
核心思路
- 提前对email字段做特殊处理:非空时自动包裹括号,空值直接返回空字符串
- 拼接前过滤所有空字符串,避免产生多余空格,无需额外调用
trim() - 用允许使用的
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
相关产品推荐
相关产品推荐

