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
に整数1
、2
および3
が含まれているとします。concatenated
は"123"
または"1,2,3"
であると思います。
簡単な方法の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(","));
参照: ストリーム削減
APIにはコレクターjoining
があります。これはCollectors
の静的メソッドです。
list.stream().map(Object::toString).collect(Collectors.joining(","))
toString
の必要な呼び出しのために完璧ではありませんが、うまくいきます。さまざまな区切り文字が可能です。
万が一誰かが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で要素を分離しようとしないであなたがあなたのデータの中に角括弧があるならサブストリングバージョンを使う、しかしそれはほとんど完璧です。
他の答えは大丈夫です。ただし、 Collectors.toList() を Stream.collect() にパラメータとして渡して、要素をArrayListとして返すこともできます。
System.out.println( list.stream().map( e -> e.toString() ).collect( toList() ) );
StringListName = ObjectListName.stream()。map(m - > m.toString()).collect(Collectors.toList());
String actual = list.stream().reduce((t, u) -> t + "," + u).get();
これを試してもいいですか。
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);
}
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());
}
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);