基本的に、あなたは関数インタフェースを作成:
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
バージョンが必要です。
をfyiとして使用する場合は、JythonまたはScalaを使用して、JVM – geowa4
...またはClojure!のリスト内包表記を取得できます。 :) – Ashe
これに関するすべての答えを読みながらSMH。 Pythonでは、40〜60文字の1行にリスト内包表記を簡単に書くことができます。ここで提案されているソリューションはすべて複数の行で、そのほとんどはPythonで使用する単一の行よりも長くなっています。 – ArtOfWarfare