リズ・ランペルージ:
私はすでに見てきた、この質問が、私の問題は少し異なっています。
私は「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());