基本的に、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
バージョンが必要になります。