Java集合/地图套用方法是否等效?


问题内容

我想将一个函数应用于Java集合,在这种特殊情况下为map。有没有很好的方法可以做到这一点?我有一张地图,想对地图中的所有值运行trim(),并让地图反映更新。


问题答案:

对于Java 8的lambda,这是一个衬里:

map.replaceAll((k, v) -> v.trim());

出于历史的考虑,这是一个没有lambda的版本:

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();
  }
});