StringJoiner удаляет разделитель с первой позиции для каждой строки

#java #string #java-8

#java #строка #java-8

Вопрос:

У меня есть следующие коды:

 StringJoiner stringJoiner = new StringJoiner(",");
List<Person> persons = Arrays.asList(new Person("Juan", "Dela Cruz"), new Person("Maria", "Magdalena"), new Person("Mario", "Santos"));
persons.forEach(person -> {
    stringJoiner.add(person.getFirstName()).add(person.getLastName()   System.lineSeparator());
});
  

Я хочу, чтобы его выходной формат был:

 Juan,Dela Cruz
Maria,Magdalena
Mario,Santos
  

Однако, учитывая приведенные выше коды, это приводит к:

 Juan,Dela Cruz
,Maria,Magdalena
,Mario,Santos
  

Как мне избавиться от разделителя , в качестве первого символа в каждой строке?

Спасибо.

Ответ №1:

Альтернативное решение — использовать потоки и объединяющий коллектор:

 String result = persons.stream()
    .map(person -> person.getFirstName()   ","   person.getLastName())
    .collect(Collectors.joining(System.lineSeparator()));
  

Комментарии:

1. Это более лаконично.

Ответ №2:

Вашим разделителем записи является новая строка, поэтому вы, вероятно, захотите использовать запятую в for-each (т. Е. поменять местами новую строку и запятую):

 StringJoiner stringJoiner = new StringJoiner(System.lineSeparator());
...
persons.forEach(person -> stringJoiner.add(person.getFirstName()   
            ", "   person.getLastName()));
  

Ответ №3:

Почему бы вам просто не переопределить метод toString класса Person или не использовать служебный метод в классе Person, который возвращает объединенную строку? Тогда ваш код просто выполнит работу по повторению и объединению:

 public static String getName(){
return String.format("%s,%s", this.firstName, this.lastName); 
}
  

А затем используйте следующий или любой подходящий механизм, где вы повторяете и сокращаете:

      persons.stream()
    .map(Person::getName)
    .collect(Collectors.joining(System.lineSeparator()));
  

Комментарии:

1. Я не уверен, вижу ли я преимущество String.format("%s,%s", this.firstName, this.lastName) над firstName "," lastName

2. Нет! Нет особого преимущества, кроме простого стиля объединения строки.