java - 您可以在不映射到字符串的情况下收集(joining())吗?

标签 java java-8 java-stream

我正在阅读java 8 in action,作者说如果你有一个重写toString方法的类,那么在执行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());

有效,那么这本书是错的?另外,他为什么这么说(我稍微改了一下措辞):

Also note that if a class had a toString method returning a string, you’d obtain the same result without needing to map over the original stream with a function extracting the name.

什么时候每个对象都应该从 Object 继承 toString

最佳答案

书上所说的都是错误的,而你的解释是正确的(除非观点完全不同并且你没有明白)

people.stream()

将生成Stream<People> ,而Collectors.joining定义为:

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

显然这不能像Person那样工作不是 CharSequence 的实例.

关于java - 您可以在不映射到字符串的情况下收集(joining())吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583490/

相关文章:

java - 为什么 Servlet.service() for servlet jsp 会抛出这个异常?

java - Android clazz.getConstructors() 返回错误数量的构造函数,仅在实时应用程序中

arraylist - 如何使用流查找字符串的嵌套数组列表的最大值

java - Java 中的正则表达式 - 解析字符串数组

java - 如何在 GridBagLayout 上放置背景图片

java - 短按显示上下文菜单而不是长按

Java 8 由于多重继承而无法实现两个接口(interface)

java - 为什么没有 OptionalDouble orElseNull() 或更好的解决方案

java - 流式传输 map 并在 Java 8 中对其进行修改