#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. Нет! Нет особого преимущества, кроме простого стиля объединения строки.