Javaの8 foreachの内部で使用する文字列を置き換えます

リズ・ランペルージ:

私はすでに見てきた、この質問が、私の問題は少し異なっています。

私は「baseString」、n個のHashMapと出力文字列を持っています。私は、JSON呼び出しパラメータを構築するために、ハッシュマップでbaseStringを埋めたいです。

私はすでに、このように、Javaの7でそれを行っています。

HashMap<String,Integer> element= getAllElement();

String baseElem="{\"index\":{}}\r\n" + 
        "{\"name\":\"$name$\",\"age\":$age$}";

String result=baseElem;

for (Map.Entry<String, Integer> entry : element.entrySet()) {

    result=result.replace("$name$", entry.getKey());
    result=result.replace("$age$", entry.getValue().toString());
    result=result+baseElem;
}
result= result.replace(baseElem, "");

今、私は、Java 8と同じにしたい、私はこの方法で試してみました:

element.forEach((k,v)->{
            result=result.replaceAll("$name$", k);
            result=result.replaceAll("$age$", v.toString());
            result=result+baseElem;
        });

しかし、それぞれの結果のために、私はエラーを持っています

「囲み範囲で定義されたローカル変数の結果は、最終的な、または効果的に最終でなければなりません」

質問があるので、私は、Java 8とストリームとの双方向のいくつかの種類にそれを行うことができますか?それとも、私は単純なJava 7を使用することができますので、方法はありませんかfor

ホルガー:

あなたのアプローチは完全に間違った方向に行っています。これだけでなく、関数型プログラミングスタイルを矛盾され、ストリームAPIを採用しています。でも、ループが繰り返さ文字列の連結を行い、恐ろしく非効率であり、成長して結果文字列の操作を交換してください。

あなたはやったShlemiel画家のアルゴリズムを

あなたが実際にのみ実行するreplace上での動作をbaseElem、各マップエントリのテンプレートと、すべての結果を結合します。これは、直接表現することができます。

Map<String,Integer> element = getAllElement();

String baseElem = "{\"index\":{}}\r\n{\"name\":\"$name$\",\"age\":$age$}";

String result = element.entrySet().stream()
    .map(e -> baseElem.replace("$name$", e.getKey())
                      .replace("$age$",  e.getValue().toString()))
    .collect(Collectors.joining());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=314631&siteId=1