Java 实现CharSequence以便使用String.join?

Java 实现CharSequence以便使用String.join?,java,string,collections,tostring,charsequence,Java,String,Collections,Tostring,Charsequence,我有一个对象集合,所有对象都覆盖toString()。 我想将它们写入控制台或连接到字符串,基本上为集合创建一个toString() 我可以使用for循环来实现这一点String.join()似乎是一种更好的方法,因为它消除了显式循环: import java.util.ArrayList; public class Foo { private double member; public Foo() { member = Math.random();

我有一个对象集合,所有对象都覆盖
toString()
。 我想将它们写入控制台或连接到字符串,基本上为集合创建一个
toString()

我可以使用for循环来实现这一点
String.join()
似乎是一种更好的方法,因为它消除了显式循环:

import java.util.ArrayList;

public class Foo
{
    private double member;

    public Foo()
    {
        member = Math.random();
    }

    @Override
    public String toString()
    {
        return "I'm foo " + member;
    }

    public static void main(String[] args)
    {
        ArrayList<Foo> foos = new ArrayList<>();
        foos.add(new Foo());
        foos.add(new Foo());
        foos.add(new Foo());
        foos.add(new Foo());
        foos.add(new Foo());
        foos.add(new Foo());

        // print collection with loop
        for (Foo foo : foos)
        {
            System.out.println(foo);
        }

        // print collection with String.join
        System.out.println(String.join(System.lineSeparator(), foos));  // fails
    }
}
但这似乎是相当多的代码,在这种情况下除了保证将对象转换为
字符串
的可能性之外,这些代码并没有起到多大作用,而每个
对象
都以
toString()的形式拥有该字符串

解决方案中引入的样板代码比它删除的样板代码大

我怎样才能让一个类在
String.join()


我应该走这条路线并实现接口,还是应该动态运行一些转换?

根据使用情况,这条路线可能效率低下,因为对CharSequence方法的每次调用都会重新调用toString。例如,如果一个方法试图迭代每个字符,您将看到糟糕的性能。既然您使用的是Java8,为什么不使用Streams API呢

System.out.println(foos.stream()
        .map(Object::toString)
        .collect(Collectors.joining(System.lineSeparator())));

根据使用情况,该路由可能效率低下,因为对CharSequence方法的每次调用都会重新调用toString。例如,如果一个方法试图迭代每个字符,您将看到糟糕的性能。既然您使用的是Java8,为什么不使用Streams API呢

System.out.println(foos.stream()
        .map(Object::toString)
        .collect(Collectors.joining(System.lineSeparator())));

同样,这是一个快速实现,可以在性能方面得到改进。问题是关于实现接口所需的样板代码。是的,您确实需要实现接口的所有成员。但是,如果你需要为几个类做这个工作,在java 8中,你可以使用一个有目的的设计的接口来和损坏的方法一样使用C++混合席。@哈维尔MaldIn:嗯,你只需要实现<代码>抽象<代码>成员,所以问题的例子比必要的工作要多得多。尽管如此,你关于糟糕表现的危险的说法仍然成立。同样,这是一个快速的实现,可以在性能方面得到改进。问题是关于实现接口所需的样板代码。是的,您确实需要实现接口的所有成员。但是,如果你需要为几个类做这个工作,在java 8中,你可以使用一个有目的的设计的接口来和损坏的方法一样使用C++混合席。@哈维尔MaldIn:嗯,你只需要实现<代码>抽象<代码>成员,所以问题的例子比必要的工作要多得多。尽管如此,您关于糟糕性能危险的说法仍然成立。您不需要实现
default
方法,因此
chars()
codePoints()
已经过时。但是无论如何,为此目的实现
CharSequence
仍然是没有用的,所以请继续使用公认的答案。您不需要实现
default
方法,因此
chars()
codePoints()
已经过时。但是无论如何,为此目的实现
CharSequence
仍然是没有用的,所以请继续使用公认的答案。