PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Monday, September 5, 2022

[FIXED] How to simplify String concat in java?

 September 05, 2022     java, simplify, string, trim     No comments   

Issue

Given the following code:

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);
    }

I am trying and discussing in the team how the simpliest code could look like while one could use also constructs like:

  • org.apache.commons.lang3.StringUtils: defaultString()
  • MoreObjects.firstNonNull(user.getVorname(), Strings.EMPTY)

A possible test could be like (expected results are visible here too):

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);
  }

Any ideas welcome... what could I try?

BTW: java 17 is allowed :-)

The following code seemss to be very close but does not handle the braces for email if existing:

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);

Solution

Since you have duplicated code to transform vorname, nachname and userId you may want to extract the logic to a Function or an UnaryOperator because it is a string to string transformation and an additional one for the email. Example

import java.util.function.UnaryOperator;

....

private static final String EMPTY = "";
private static final String DELIMITER = " ";

UnaryOperator<String> nameOp = o -> Optional.ofNullable(o).orElse(EMPTY);
UnaryOperator<String> mailOp = o -> Optional.ofNullable(o).map(s -> String.format("(%s)", s)).orElse(EMPTY);

@AfterMapping
protected void createCompactInfo(@MappingTarget User user) {
   String compactInfo = Stream.of(nameOp.apply(user.getVorname()),
                                  nameOp.apply(user.getNachname()),
                                  mailOp.apply(user.getEmail()))
                               .filter(Predicate.not(String::isEmpty))
                               .collect(Collectors.joining(DELIMITER));

   user.setCompakt(compactInfo.isEmpty() ? nameOp.apply(user.getId()) : compactInfo);
}


Answered By - Eritrean
Answer Checked By - Clifford M. (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing