web-dev-qa-db-ja.com

Java 8を使用してオブジェクトのリストをtoString()メソッドから取得した文字列に変換する

Java 8には便利な新しいことがたくさんあります。たとえば、オブジェクトのリストをストリームで繰り返し処理してから、Objectのインスタンスの特定のフィールドの値を合計することができます。例えば。

public class AClass {
  private int value;
  public int getValue() { return value; }
}

Integer sum = list.stream().mapToInt(AClass::getValue).sum();

そのため、toString()メソッドの出力を1行にまとめたStringを作成する方法があるかどうかを尋ねています。

List<Integer> list = ...

String concatenated = list.stream().... //concatenate here with toString() method from Java.lang.Integer class

listに整数12および3が含まれているとします。concatenated"123"または"1,2,3"であると思います。

150
mat_boy

簡単な方法の1つは、リスト項目をStringBuilderに追加することです。

   List<Integer> list = new ArrayList<>();
   list.add(1);
   list.add(2);
   list.add(3);

   StringBuilder b = new StringBuilder();
   list.forEach(b::append);

   System.out.println(b);

あなたも試すことができます:

String s = list.stream().map(e -> e.toString()).reduce("", String::concat);

説明:mapはIntegerストリームをStringストリームに変換してから、すべての要素の連結として減らします。

注:これはO(nで実行されるnormal reductionです)2

パフォーマンスを向上させるには、F.Böllerの回答に似たStringBuilderまたはmutable reductionを使用してください。

String s = list.stream().map(Object::toString).collect(Collectors.joining(","));

参照: ストリーム削減

288
Shail016

APIにはコレクターjoiningがあります。これはCollectorsの静的メソッドです。

list.stream().map(Object::toString).collect(Collectors.joining(","))

toStringの必要な呼び出しのために完璧ではありませんが、うまくいきます。さまざまな区切り文字が可能です。

154
F. Böller

万が一誰かがJava 8なしでこれをやろうとしているなら、かなり良いトリックがあります。 List.toString()は既に次のようなコレクションを返します。

[1,2,3]

あなたの特定の要件に応じて、これはあなたのリストアイテムが[]またはを含まない限りあなたが望むものに後処理することができます。

例えば:

list.toString().replace("[","").replace("]","") 

データに角括弧が含まれる可能性がある場合は、次のようにします。

String s=list.toString();
s = s.substring(1,s.length()-1) 

かなり合理的な出力が得られます。

各行に1つの配列項目を次のように作成できます。

list.toString().replace("[","").replace("]","").replaceAll(",","\r\n")

このテクニックを使用して、小さなアプリケーションのリストからHTMLツールチップを作成しました。

list.toString().replace("[","<html>").replace("]","</html>").replaceAll(",","<br>")

もしあなたが配列を持っているなら、代わりにArrays.asList(list).toString()で始めてください。

私はこれが最適ではないという事実を完全に所有するつもりですが、あなたが思うほど非効率的ではなく、読んで理解するのはとても簡単です。しかし、それは非常に融通が利かない - 特にあなたのデータがコンマを含むかもしれないならreplaceAllで要素を分離しようとしないであなたがあなたのデータの中に角括弧があるならサブストリングバージョンを使う、しかしそれはほとんど完璧です。

10
Bill K

他の答えは大丈夫です。ただし、 Collectors.toList()Stream.collect() にパラメータとして渡して、要素をArrayListとして返すこともできます。

System.out.println( list.stream().map( e -> e.toString() ).collect( toList() ) );
4
Eddie B

StringListName = ObjectListName.stream()。map(m - > m.toString()).collect(Collectors.toList());

1
Rekha Ghanate
String actual = list.stream().reduce((t, u) -> t + "," + u).get();
1
Joe Almore

これを試してもいいですか。

public static void main(String []args){
        List<String> stringList = new ArrayList<>();
        for(int i=0;i< 10;i++){
            stringList.add(""+i);
        }
        String stringConcated = String.join(",", stringList);
        System.out.println(stringConcated);

    }
0
Kumar Abhishek

Shail016 および bpedroso answer( https://stackoverflow.com/a/24883180/2832140 )で提案されている両方のアプローチをテストすると、StringBuilderループ内の単純なfor + append(String)が実行されるようです。 list.stream().map([...]よりはるかに速いです。

例:このコードは、list.stream().map([...]を使用してjson文字列を構築するためにMap<Long, List<Long>>を通過します。

if (mapSize > 0) {
    StringBuilder sb = new StringBuilder("[");

    for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {

        sb.append("{\"" + entry.getKey().toString() + "\":[");
        sb.append(entry.getValue().stream().map(Object::toString).collect(Collectors.joining(",")));
    }
    sb.delete(sb.length()-2, sb.length());
    sb.append("]");
    System.out.println(sb.toString());
}

私の開発用VMでは、junitがテストを実行するのに通常0.35から1.2秒かかります。次のコードを使用すると、0.15秒から0.33秒かかります。

if (mapSize > 0) {
    StringBuilder sb = new StringBuilder("[");

    for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {

        sb.append("{\"" + entry.getKey().toString() + "\":[");

        for (Long tid : entry.getValue()) {
            sb.append(tid.toString() + ", ");
        }
        sb.delete(sb.length()-2, sb.length());
        sb.append("]}, ");
    }
    sb.delete(sb.length()-2, sb.length());
    sb.append("]");
    System.out.println(sb.toString());
}
0
List<String> list = Arrays.asList("One", "Two", "Three");
    list.stream()
            .reduce("", org.Apache.commons.lang3.StringUtils::join);

または

List<String> list = Arrays.asList("One", "Two", "Three");
        list.stream()
                .reduce("", (s1,s2)->s1+s2);

この方法では、オブジェクトのリストから文字列の結果を構築することもできます。

List<Wrapper> list = Arrays.asList(w1, w2, w2);
        list.stream()
                .map(w->w.getStringValue)
                .reduce("", org.Apache.commons.lang3.StringUtils::join);

ここでreduce関数は新しい文字列を追加したい初期値を持つことを可能にします例:

 List<String> errors = Arrays.asList("er1", "er2", "er3");
            list.stream()
                    .reduce("Found next errors:", (s1,s2)->s1+s2);
0
0vint0