このコードをどのようにして単一のラムダ式に単純化できますか?アイデアはマップのリストがあり、キーのフィルターを使用してマップの新しいリストを作成したいと考えています。この例では、キー "x"と "z"のみを保持するように再マップします。Java 8ストリームを使用したマップのリストの処理
Map<String, String> m0 = new LinkedHashMap<>();
m0.put("x", "123");
m0.put("y", "456");
m0.put("z", "789");
Map<String, String> m1 = new LinkedHashMap<>();
m1.put("x", "000");
m1.put("y", "111");
m1.put("z", "222");
List<Map> l = new ArrayList<>(Arrays.asList(m0, m1));
List<Map> tx = new ArrayList<>();
for(Map<String, String> m : l) {
Map<String, String> filtered = m.entrySet()
.stream()
.filter(map -> map.getKey().equals("x") || map.getKey().equals("z"))
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
tx.add(filtered);
}
System.err.println("l: " + l);
System.err.println("tx: " + tx);
出力:入力キーがx
かz
ない場合
List<Map<String, String>> l = Arrays.asList(m0, m1);
l.forEach(map -> {
map.entrySet().removeIf(e -> !e.getKey().equals("x") && !e.getKey().equals("z"));
});
それは単にすべてのMap<String, String>
にすべてのマッピングを削除します。
l: [{x=123, y=456, z=789}, {x=000, y=111, z=222}]
tx: [{x=123, z=789}, {x=000, z=222}]
このスタイルでは、さらに小さなバージョンはmap.keySet()。retainAll(Arrays.asList( "x"、 "z")) 'のようなものを使うことになります。 (編集:しかし、補足として、コレクターとのOPのコードは、これらが全く同じではないようにコピーを作成します。) – Radiodef
@Radiodefああ、良いキャッチ! –
'removeIf'ベースの解でさえ、' Entry'で '.getKey()'を2回呼び出すのではなく、 '.keySet()'を最初に使用して表現形式から利益を得ます: 'l.forEach(map - > "k.equals(" x ")&&!k.equals(" z "))); map.keySet()。removeIf(k - >! – Holger