你可以收集(加入())而不映射到字符串吗?

Cod*_*Man 2 java java-8 java-stream

我正在阅读java 8,并且作者说如果你有一个覆盖toString方法的类,那么在进行collect(joined())时你不需要将流映射到字符串.一个例子:

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

    }
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,只有这样:

String peopleString = people
                .stream()
                .map(Person::toString)
                .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

工作,所以这本书错了吗?此外,为什么他说(我改变了一点措辞):

另请注意,如果某个类有一个toString方法返回一个字符串,您将获得相同的结果,而无需使用提取名称的函数映射原始流.

当每个对象应该继承toStringObject

Eug*_*ene 7

无论这本书说错了,你的解释是对的(除非这一点完全不同,你没有得到它)

people.stream()
Run Code Online (Sandbox Code Playgroud)

会产生一个Stream<People>,同时Collectors.joining有一个定义:

public static Collector<CharSequence, ?, String> joining()
Run Code Online (Sandbox Code Playgroud)

显然这不能工作,因为Person它不是一个实例CharSequence.