2016-03-25 7 views
17

これはC#ではなくJavaで行う方法しか見つからないようです。Java 8ラムダ式を使用して1つのタイプのリストをそのサブタイプのリストに変換する方法

私はList<TypeX>ですが、そのリストのすべての要素は実際にはTypeXというサブクラスであることがわかりますTypeYと呼ばれています。

List<TypeX>を受け入れ、List<TypeY>を返すラムダ式を書くにはどうすればよいですか?私例えば

+0

何か試しましたか? – Reimeus

+0

私が正直でないなら、私はまだJavaのラムダ構文を取り上げています。 –

+0

別の方法で同じインスタンスを表示しようとしていますか(安全でないか)、3つの回答のように新しいリストを作成しようとしていますか? –

答えて

22

、私は次のクラスを使用します:

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; 
+5

エラーを除外するフィルターが原因でこれを正解として受け入れますが、コレクターのStaticインポートを言及するか、Collectors.toList()への応答を変更することをお勧めします。 –

+0

この回答ありがとう! – dahui

4

要素をキャストラムダを持つだけで、すべてのmap:Javaで

List<TypeX> list = ...; 
List<TypeY> castList = 
    list.stream().map(x -> (TypeY)x).collect(Collectors.toList()); 
5

投影があるエラーが発生します項目を除外mapメソッドを使用して完了:

List<TypeY> res = listTypeX 
    .stream() 
    .map((x) -> (TypeY)x) 
    .collect(Collectors.toList()); 
2

あなたは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に貢献しています。

関連する問題