Java collection/map apply方法等效吗?

jos*_*evl 24 java collections apply

我想将一个函数应用于Java集合,在这种特殊情况下是一个映射.有一个很好的方法来做到这一点?我有一个地图,并希望对地图中的所有值运行trim()并让地图反映更新.

eri*_*son 37

使用Java 8的lambdas,这是一个单行:

map.replaceAll((k, v) -> v.trim());
Run Code Online (Sandbox Code Playgroud)

为了历史,这里是没有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());
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,更一般地说:

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();
  }
});
Run Code Online (Sandbox Code Playgroud)

  • @jamesemanon这意味着传递给此方法的映射可以具有任何类型的键,但该值必须是"String".您可以从[Java Tutorial](https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html)获取基础知识.[Angelika Langer的通用常见问题解答](http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html)提供了有关Java泛型所有方面的更多详细信息. (2认同)

Jea*_*nal 11

除了您接受的响应之外,我不知道如何使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

该方法与提议的方法的最大区别在于它提供了原始地图的视图,这意味着,虽然它始终与原始地图同步,但apply如果您正在大量操作所述地图,则可以多次调用该方法.

Collections2.transform(Collection<F>,Function<F,T>)收集存在类似的方法.