基本上,您创建一个函数接口:
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