Вы можете собрать (joining ()) без сопоставления со строкой? - PullRequest
0 голосов
/ 29 мая 2018

Я читаю Java 8 в действии, и автор говорит, что если у вас есть класс, который переопределяет метод toString, вам не нужно отображать поток в Strings при выполнении collect (joining ()).Пример:

    public static void main(String... args) {
        List<Person> people =
        Arrays.asList(
                new Person(23, "Paul"),
                new Person(23, "John"),
                new Person(23, "Greg"),
                new Person(24, "Greg"),
                new Person(25, "Paul")
        ); // Person overrides toString

        String peopleString = people
                .stream()
                .collect(Collectors.joining());

        System.out.println(peopleString);

    }

Однако, это не работает, и только это:

String peopleString = people
                .stream()
                .map(Person::toString)
                .collect(Collectors.joining());

работает, значит, книга не так?Кроме того, почему он говорит (я немного изменил формулировку):

Также обратите внимание, что если у класса есть метод toString, возвращающий строку, вы получите тот же результат без необходимости отображатьисходный поток с функцией, извлекающей имя.

Когда каждый объект должен наследовать toString от Object?

1 Ответ

0 голосов
/ 29 мая 2018

Что бы ни говорилось в книге неверно, и ваша интерпретация верна (если точка совершенно не отличается, и вы ее не поняли)

people.stream()

сгенерирует Stream<People>, тогда как Collectors.joining имеетопределение:

public static Collector<CharSequence, ?, String> joining()

очевидно, что это не может работать, поскольку Person не является экземпляром CharSequence.

...