由于Java不允许将方法作为参数传递,因此您使用什么技巧来实现Python(如Java中的列表理解)?
我有一个字符串列表(ArrayList)。我需要通过使用函数来转换每个元素,以便获得另一个列表。我有几个函数,它们将一个String作为输入,并返回另一个String作为输出。如何制作一个可以将列表和函数作为参数的通用方法,这样我就可以在处理完每个元素后获取列表。从字面上看这是不可能的,但是我应该使用什么技巧?
另一个选择是为每个较小的String处理函数编写一个新函数,该函数仅循环遍历整个列表,这并不是那么酷。
基本上,您可以创建一个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(基本上创建从输入列表到输出列表的映射):
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版本。
map