web-dev-qa-db-ja.com

ラムダを使用してMapを文字列にフォーマットする

Integerキーと値を持つマップがあります。この特定の形式でStringに変換する必要があります:key1 - val1, key2 - val2, key3 - val3。今、私はforEachを使用して各要素をフォーマットし、それらをリストに収集してからString.join();を実行しています。

List<String> ships = new ArrayList<>(4);
for (Map.Entry<Integer, Integer> entry : damagedMap.entrySet())
{
    ships.add(entry.getKey() + " - " + entry.getValue());
}
result = String.join(",", ships);

それを行う短い方法はありますか?そして、ラムダを使用するのは良いことです。ラムダを使用する練習が必要だからです。

42
TEXHIK

次のようなものを探していると思います:

_import Java.util.*;
import Java.util.stream.*;
public class Test {

    public static void main(String[] args) throws Exception {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "foo");
        map.put(2, "bar");
        map.put(3, "baz");
        String result = map.entrySet()
            .stream()
            .map(entry -> entry.getKey() + " - " + entry.getValue())
            .collect(Collectors.joining(", "));
        System.out.println(result);
    }
}
_

ビットを順番に確認するには:

  • entrySet()は、反復可能なエントリのシーケンスを取得します
  • stream()はその反復可能のストリームを作成します
  • map()は、エントリのストリームを「キー-値」形式の文字列のストリームに変換します
  • collect(Collectors.joining(", "))は、_", "_を区切り文字として使用して、ストリーム内のすべてのエントリを単一の文字列に結合します。 _Collectors.joining_ は、 Collector を返すメソッドです。このメソッドは、文字列の入力シーケンスに対して機能し、単一の文字列の結果を返します。

HashMapは順序付けされていないため、順序はここで保証されていることに注意してくださいnotTreeMapを使用して、キーの順序で値を取得できます。

82
Jon Skeet