RoyalTiger:
私は地図を持っています。入力は、他のクラスから来ているので、私は形式を変更することはできません。値は、私の場合は一覧です。私は特定のキーのためのいくつかの要素を削除したいです。例えば、以下の入力マップです。
Map<String, Object> map = new HashMap<>();
map.put("1", Arrays.asList("A","V","C","M"));
map.put("Roll", 123);
これは、つまり、私に与えられて、私はキー=「1」のための2つのエントリを削除したいされてきた「マップ」 Arrays.asList("V","M")
私は以下のコードを試してみました、それが働きました。私は、これよりもより良い方法があるかを知りたいです。注:私は、Java 8を使用してそれを実行しようとしています。
List<String> list = Arrays.asList("V","M")
List<String> lst = map.entrySet().stream()
.map(Map.Entry::getValue)
.filter(c -> c instanceof Collection)
.map(c -> (Collection<String>)c)
.flatMap(Collection::stream)
.collect(Collectors.toList());
lst.removeIf(c -> list.contains(c));
/ ** *この後、私は再びマップに、この最終的なリストを追加することができます.. * /
final output: <"1", {"A", "C"}>
<"Roll", 123>
デッドプール :
、私が使用して好むこれを行うためのストリームの必要はありませんcomputeIfPresent
中にキー存在する場合Map
、ALTER値は他の無視は。使用しないでくださいは、Arrays.asListをあなたは不変のリストを必要としない限り、それはサポートされませんのでremove
、操作を
List<String> list = new ArrayList<String>();
list.add("A");
list.add("V");
list.add("C");
list.add("M");
Map<String, Object> map = new HashMap<>();
map.put("1", list);
map.put("Roll", 123);
List<String> remove = Arrays.asList("V","M");
map.computeIfPresent("1", (k,v)->{
if(Objects.nonNull(v) && v instanceof List) {
@SuppressWarnings("unchecked")
List<String> result = (List<String>) v;
result.removeIf(i->remove.contains(i));
return result;
}
return v;
});
System.out.println(map); //{1=[A, C], Roll=123}