0

すべてオーバーライドするオブジェクトのコレクションがあります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
    }
}

機能するためSystem.out.println()に、toString()メソッドが呼び出されます。インターフェイスを明示的に実装する必要はありません。これは簡単なようで、一般的な方法です。

しかし、String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)仕事を始めるには、toString()方法があるだけでは十分ではありません。が必要です。Iterable<? extends CharSequence>つまり、Foo実装する必要がありますCharSequence

次に、次のように委譲して、そのインターフェイスをすばやく実装しましたtoString()

import java.util.ArrayList;
import java.util.stream.IntStream;

import java.lang.CharSequence;

public class Foo implements CharSequence
{
    private double member;

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

    @Override
    public char charAt(int index)
    {
        return toString().charAt(index);
    }

    @Override
    public IntStream chars()
    {
        return toString().chars();
    }

    @Override
    public IntStream codePoints()
    {
        return toString().codePoints();
    }

    @Override
    public int length()
    {
        return toString().length();
    }

    @Override
    public CharSequence subSequence(int start, int end)
    {
        return toString().subSequence(start, end);
    }

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

        System.out.println(String.join(System.lineSeparator(), foos));  
    }
}

しかし、これはかなりの量のコードのようで、オブジェクトを に変換する可能性を保証することを除いて、この状況ではあまり機能していStringませObjecttoString()

ソリューションに導入されたボイラープレート コードは、削除されたボイラープレート コードよりも大きくなっています。

でクラスをうまくプレイするにはどうすればよいString.join()ですか?

そのルートに進んでインターフェイスを実装する必要がありますか、それともその場で変換を実行する必要がありますか?

4

1 に答える 1

3

使い方によっては、CharSequence メソッドを呼び出すたびに toString が新たに呼び出されるため、このルートは非効率的である可能性があります。たとえば、メソッドが各文字を繰り返し処理しようとすると、ひどいパフォーマンスが見られます。Java 8 を使用しているので、Streams API を使用してみませんか?

System.out.println(foos.stream()
        .map(Object::toString)
        .collect(Collectors.joining(System.lineSeparator())));
于 2016-05-15T15:30:03.430 に答える