2016-08-08 10 views
-1

ここに問題があります。Java8 2つの異なるオブジェクトストリームから3番目のオブジェクトのソートされたリストへのデータの収集

Map<Id,ObjectClassA> mapObjectClassA 

Map<Id,ObjectClassB> mapObjectClassB 

どちらも、これらのマップは同じサイズのものである - 私は2つのマップを持って

class ObjectClassA 
{ 
    private final long id; 
    private final String name; 
    private final boolean isReadOnly; 
    //<some more fields> 

    long getId() 
    { 
     return this.id; 
    } 

    String getName() 
    { 
     return this.name; 
    } 

    boolean isReadOnly() 
    { 
     return this.isReadOnly; 
    } 
} 

class ObjectClassB 
{ 
    private final long id; 
    private final String location; 
    private final boolean isReadOnly; 
    //<some more fields> 

    long getId() 
    { 
     return this.id; 
    } 

    String getLocation() 
    { 
     return this.location; 
    } 

    boolean isReadOnly() 
    { 
     return this.isReadOnly; 
    } 
} 

class ObjectClassC 
{ 
    private final String location; 
    private final boolean isReadOnly; 
    private final String location; 

    String getName() 
    { 
     return this.name; 
    } 

    boolean isReadOnly() 
    { 
     return this.isReadOnly; 
    } 

    String getLocation() 
    { 
     return this.location; 
    } 
} 

:以下のように私は三つのクラスを持っています。 IDキーは両方のマップに共通です。その目的は、(ObjectClassC.nameで)ようにList<ObjectClassC>オブジェクトソートを作成するために、いずれかのマップを反復処理することである:これは私が今持っているロジックです

ObjectClassC.name = ObjectClassA.name 
ObjectClassC.isReadOnly = ObjectClassA.isReadOnly || ObjectClassB.isReadOnly 
ObjectClassC.location = ObjectClassB.location 

を次のようになります。

final List<ObjectClassC> list = 
mapObjectClassA.values() 
       .stream() 
       .map(a -> { 
        new ObjectClassC(a.getName(), 
            a.isReadOnly() || mapObjectClassB.get(a.getId).isReadOnly(), 
            mapObjectClassB.get(a.getId).getLocation()) 
       }) 
       .sorted(Comparator.comparing(ObjectClassC::getName)) 
       .collect(Collectors.<ObjectClassC> toList()); 

私のマッピングコレクションは正常に動作していますが、私はObjectClassCオブジェクトのソートされたコレクションを取得しません。誰かが間違っているところを指摘してくれますか?

+1

あなたは、単純な作業[MCVE]を投稿することができますか? 'sorted'演算は名前でソートされるべきです。サンプル入力ではどのような出力が得られますか? – Tunaki

+1

コードにかなりの数のタイプミスがあります。 '.sorted'行の最後に') 'がありません。 'a.getId'には'() 'はありません。 'new ObjectClassC'部分の余分な中カッコです。本当にコピー&ペーストする方が良いでしょう。 –

+0

'ObjectClassC'に' location'という2つのフィールドを持つことはできません。 – Andreas

答えて

0

いいですが、うまくいきます。

public class MapMerge_38837365 { 

    public static void main(String[] args) { 
     Map<Integer, A> as = new HashMap(); 
     as.put(1, new A("Anna")); 
     as.put(2, new A("Maria")); 
     as.put(3, new A("Eva")); 

     Map<Integer, B> bs = new HashMap(); 
     bs.put(1, new B("Adam")); 
     bs.put(2, new B("Edward")); 
     bs.put(3, new B("Jon")); 

     Stream.concat(
       as.entrySet().stream(), 
       bs.entrySet().stream() 
     ).collect(Collectors.groupingBy(Map.Entry::getKey)) 
       .entrySet().stream() 
       .map(e -> e.getValue()) 
       .map(e -> { 
        if (e.get(0).getValue() instanceof A) 
         return new AB((A) e.get(0).getValue(), (B) e.get(1).getValue()); 
        return new AB((A) e.get(1).getValue(), (B) e.get(0).getValue()); 
       }) 
       .map(ab -> new C(ab.a.name+" " +ab.b.name)) 
       .forEach(System.out::println); 
    } 
} 

"ハイマジック" は、その後Stream.concatgroupingByに起こります。この2行では、両方のマップからすべてのエントリのストリームを作成します。それから、それらをキーでグループ化してマップします。同じキー(id)を持つ要素はList<Object>に移動します。次のステップは、グループ化マップentrySet().stream()から新しいストリームを作成することです。

次に、同じId>map(e -> e.getValue())の値エントリを抽出します。

次のステップはABオブジェクトをビルドすることですが、省略することができますが、タイプチェックを抽出して別の関数にキャストしたいと考えています。今私達は擬似ペアABを持っています、それはCクラスmap(ab -> new C(ab.a.name+" " +ab.b.name))を作成するための非常に良い候補です。

クラスABCAB

class A { 

    final String name; 

    A(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "A{" + 
       "name='" + name + '\'' + 
       '}'; 
    } 
} 

class B { 

    final String name; 

    B(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "B{" + 
       "name='" + name + '\'' + 
       '}'; 
    } 
} 

class C { 

    final String name; 

    C(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "C{" + 
       "name='" + name + '\'' + 
       '}'; 
    } 
} 

class AB { 

    final A a; 
    final B b; 

    AB(A a, B b) { 
     this.a = a; 
     this.b = b; 
    } 

    @Override 
    public String toString() { 
     return "AB{" + 
       "a=" + a + 
       ", b=" + b + 
       '}'; 
    } 
} 
関連する問題