基本上,您创建一个 Function 接口:
public interface Func<In, Out> {
public Out apply(In in);
}
然后将匿名子类传递给您的方法。
您的方法可以就地将该函数应用于每个元素:
public static <T> void applyToListInPlace(List<T> list, Func<T, T> f) {
ListIterator<T> itr = list.listIterator();
while (itr.hasNext()) {
T output = f.apply(itr.next());
itr.set(output);
}
}
// ...
List<String> myList = ...;
applyToListInPlace(myList, new Func<String, String>() {
public String apply(String in) {
return in.toLowerCase();
}
});
或创建一个新的List
(基本上是创建从输入列表到输出列表的映射):
public static <In, Out> List<Out> map(List<In> in, Func<In, Out> f) {
List<Out> out = new ArrayList<Out>(in.size());
for (In inObj : in) {
out.add(f.apply(inObj));
}
return out;
}
// ...
List<String> myList = ...;
List<String> lowerCased = map(myList, new Func<String, String>() {
public String apply(String in) {
return in.toLowerCase();
}
});
哪个更可取取决于您的用例。如果您的列表非常大,就地解决方案可能是唯一可行的解决方案;如果您希望将许多不同的功能应用于同一个原始列表以制作许多衍生列表,您将需要该map
版本。