【问题标题】:Can you collect(joining()) without mapping to string?你可以收集(加入())而不映射到字符串吗?
【发布时间】:2018-05-29 11:40:59
【问题描述】:

我正在阅读 java 8 in action,作者说如果你有一个覆盖 toString 方法的类,你不需要在做 collect(joining()) 时将流映射到 Strings。一个例子:

    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 方法返回一个字符串,您将获得相同的结果,而无需使用提取名称的函数映射原始流。

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

【问题讨论】:

  • 你不需要在Person对象中创建一个方法toString()
  • 你在哪一页看到的?
  • @YCF_L 似乎在页面166:章节6.2.3. Joining Strings。菜单示例...
  • @MarkoPacak 自己读了这句话,可能是作者所指的joining 的定义非常古老,类似于public static Collector&lt;?, ?, String&gt;,内部称为@987654331 @...
  • @MarkoPacak 如果您认为即使是功能接口在一开始就有不同的名称,那也不是真的......

标签: java java-8 java-stream


【解决方案1】:

无论书上说什么都是错误的,而你的解释是正确的(除非要点完全不同而你没有明白)

people.stream()

会生成一个Stream&lt;People&gt;,而Collectors.joining有一个定义:

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

显然这不起作用,因为Person 不是CharSequence 的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2023-02-07
    • 2011-10-06
    • 2017-03-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多