Java集合/映射应用方法等效?
2022-09-01 18:28:08
我想将一个函数应用于Java集合,在这种特殊情况下是映射。有没有一个很好的方法来做到这一点?我有一个地图,只想对地图中的所有值运行trim(),并让地图反映更新。
我想将一个函数应用于Java集合,在这种特殊情况下是映射。有没有一个很好的方法来做到这一点?我有一个地图,只想对地图中的所有值运行trim(),并让地图反映更新。
对于Java 8的lambdas,这是一个单行代码:
map.replaceAll((k, v) -> v.trim());
为了历史的缘故,这里有一个没有lambdas的版本:
public void trimValues(Map<?, String> map) {
for (Map.Entry<?, String> e : map.entrySet()) {
String val = e.getValue();
if (val != null)
e.setValue(val.trim());
}
}
或者,更一般地说:
interface Function<T> {
T operate(T val);
}
public static <T> void replaceValues(Map<?, T> map, Function<T> f)
{
for (Map.Entry<?, T> e : map.entrySet())
e.setValue(f.operate(e.getValue()));
}
Util.replaceValues(myMap, new Function<String>() {
public String operate(String val)
{
return (val == null) ? null : val.trim();
}
});
除了您接受的响应之外,我不知道如何使用JDK库来做到这一点,但是Google Collections允许您执行以下操作,包括类和:com.google.collect.Maps
com.google.common.base.Function
Map<?,String> trimmedMap = Maps.transformValues(untrimmedMap, new Function<String, String>() {
public String apply(String from) {
if (from != null)
return from.trim();
return null;
}
}
该方法与建议的方法的最大区别在于,它提供了原始地图的视图,这意味着,虽然它始终与原始地图同步,但如果对所述地图进行大量操作,则可以多次调用该方法。apply
对于集合,也存在类似的方法。Collections2.transform(Collection<F>,Function<F,T>)