另一种方法是从转换后删除您不想要的值Map
:
Map<String, Integer> output = input.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> Integer.parseInt(e.getValue()),
(a, b) -> { throw new AssertionError(); },
HashMap::new
));
output.values().removeIf(v -> v % 2 != 0);
这假设您想要一个可变Map
的结果,如果不是,您可能可以从output
.
如果您要将值转换为相同的类型并想要修改Map
就地,这可能会更短replaceAll
:
input.replaceAll((k, v) -> v + " example");
input.values().removeIf(v -> v.length() > 10);
这也假设input
是可变的。
我不建议这样做,因为它不适用于所有有效的Map
实现,并且将来可能会停止工作HashMap
,但您目前可以使用replaceAll
并转换 aHashMap
来更改值的类型:
((Map)input).replaceAll((k, v) -> Integer.parseInt((String)v));
Map<String, Integer> output = (Map)input;
output.values().removeIf(v -> v % 2 != 0);
这也会给你类型安全警告,如果你尝试Map
通过旧类型的引用从 中检索一个值,如下所示:
String ex = input.get("a");
它会抛出一个ClassCastException
.
如果您希望大量使用它,您可以将第一个转换部分移动到一个方法中以避免样板:
public static <K, VO, VN, M extends Map<K, VN>> M transformValues(
Map<? extends K, ? extends VO> old,
Function<? super VO, ? extends VN> f,
Supplier<? extends M> mapFactory){
return old.entrySet().stream().collect(Collectors.toMap(
Entry::getKey,
e -> f.apply(e.getValue()),
(a, b) -> { throw new IllegalStateException("Duplicate keys for values " + a + " " + b); },
mapFactory));
}
并像这样使用它:
Map<String, Integer> output = transformValues(input, Integer::parseInt, HashMap::new);
output.values().removeIf(v -> v % 2 != 0);
请注意,例如,如果old
Map
is anIdentityHashMap
并且mapFactory
创建 a ,则可能会引发重复键异常HashMap
。