これはC#ではなくJavaで行う方法しか見つからないようです。Java 8ラムダ式を使用して1つのタイプのリストをそのサブタイプのリストに変換する方法
私はList<TypeX>
ですが、そのリストのすべての要素は実際にはTypeX
というサブクラスであることがわかりますTypeY
と呼ばれています。
List<TypeX>
を受け入れ、List<TypeY>
を返すラムダ式を書くにはどうすればよいですか?私例えば
これはC#ではなくJavaで行う方法しか見つからないようです。Java 8ラムダ式を使用して1つのタイプのリストをそのサブタイプのリストに変換する方法
私はList<TypeX>
ですが、そのリストのすべての要素は実際にはTypeX
というサブクラスであることがわかりますTypeY
と呼ばれています。
List<TypeX>
を受け入れ、List<TypeY>
を返すラムダ式を書くにはどうすればよいですか?私例えば
、私は次のクラスを使用します:
final List<TypeX> xList = ...
あなたはTypeY.class.cast
にメソッド参照を使用するだけです:
class TypeX {}
class TypeY extends TypeX {}
をそれから私はList<TypeX>
持っています
final List<TypeY> yList = xList.stream()
.map(TypeY.class::cast)
.collect(toList());
filter()
to使用
final List<TypeY> yList = xList.stream()
.filter(TypeY.class::isInstance)
.map(TypeY.class::cast)
.collect(toList());
例:
import static java.util.stream.Collectors.toList;
エラーを除外するフィルターが原因でこれを正解として受け入れますが、コレクターのStaticインポートを言及するか、Collectors.toList()への応答を変更することをお勧めします。 –
この回答ありがとう! – dahui
要素をキャストラムダを持つだけで、すべてのmap
:Javaで
List<TypeX> list = ...;
List<TypeY> castList =
list.stream().map(x -> (TypeY)x).collect(Collectors.toList());
投影があるエラーが発生します項目を除外map
メソッドを使用して完了:
List<TypeY> res = listTypeX
.stream()
.map((x) -> (TypeY)x)
.collect(Collectors.toList());
あなたはEclipse CollectionsからselectInstancesOf()
を使用することができます。
MutableList<TypeX> xList = Lists.mutable.empty();
MutableList<TypeY> yList = xList.selectInstancesOf(TypeY.class);
あなたはList
からXLISTを変更できない場合は、次の
List<TypeX> xList = Lists.mutable.empty();
List<TypeY> yList = ListAdapter.adapt(xList).selectInstancesOf(TypeY.class);
注:私はコレクションをEclipseに貢献しています。
何か試しましたか? – Reimeus
私が正直でないなら、私はまだJavaのラムダ構文を取り上げています。 –
別の方法で同じインスタンスを表示しようとしていますか(安全でないか)、3つの回答のように新しいリストを作成しようとしていますか? –