Элегантный способ добавить строку, которая не равна нулю - PullRequest
1 голос
/ 29 октября 2019

У меня есть класс, который содержит некоторые атрибуты, и я хочу объединить атрибут, если значение не равно нулю. Какой элегантный способ сделать это? То, что я сделал до сих пор, примерно так (в методе combine).

public class X {
    private String a;
    private String b;
    private String c;
    private String d;
    private String e;
    private int f;
    private Date g;

    public String combine() {
        String result = "";
        if (!StringUtils.isEmpty(this.a)) {
            result += a + "\n";
        }
        if (!StringUtils.isEmpty(this.b)) {
            result += b + "\n";
        }
        if (!StringUtils.isEmpty(this.c)) {
            result += c + "\n";
        }
        if (!StringUtils.isEmpty(this.d)) {
            result += d + "\n";
        }
        if (!StringUtils.isEmpty(this.e)) {
            result += e + "\n";
        }
        return result;
    }
}

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Вы можете сделать это методом toString, используя java-8 stream

Stream.of(this.getA(),this.getB(),this.getC(),this.getD(),this.getE())
      .filter(str->!StringUtils.isEmpty(str))
      .collect(Collectors.joining("\n"));

или вы можете использовать StringUtils. isNotEmpty

 Stream.of(this.getA(),this.getB(),this.getC(),this.getD(),this.getE())
      .filter(StringUtils::isNotEmpty)
      .collect(Collectors.joining("\n"));
1 голос
/ 29 октября 2019

Вы можете использовать поток.

Stream.of(this.a, this.b, this.c, this.d, this.e)
            .filter(StringUtils::isNotEmpty)
            .map(str -> str + "\n")
            .collect(Collectors.joining())
1 голос
/ 29 октября 2019

Один из подходов заключается в использовании потоков:

return Stream.of(a, b, c, d, e)
    .filter(str -> !StringUtils.isEmpty(str))
    .map(str -> str + "\n")
    .collect(Collectors.joining());

Сначала отфильтровываются все пустые строки, затем добавляется \n к каждому элементу и, наконец, объединяются все фрагменты вstring.

Обратите внимание, что вместо методов map и collect вы также можете использовать collect(Collectors.joining("\n")) (см. ответ Дэдпула), но затем обратите внимание, что за последним элементом не следует новая строка. Поэтому вам нужно добавить его к результату самостоятельно.

Также обратите внимание, что, как сказал YCF_L в комментариях, вы можете заменить filter(str -> !StringUtils.isEmpty(str)) ссылкой на метод .filter(StringUtils::isNotEmpty), используя тот факт, что StringUtilsкласс предлагает обратную isEmpty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...