2016-10-24 3 views
-1

Ich habe Objektstruktur wie unten:Convert Liste der Liste des Objekts auf eine Karte - mit Lambda-Ausdrücke in Java 8

Order { 
    int code; 
    int id; 
    List<Item>; 
} 

Item { 
    int code; 
    int quantity; 
    List<Suborder>; 
} 

Suborder { 
    int code; 
    int quantity; 
} 

Ich habe ein Objekt von O und ich möchte eine Karte von Code B. Was ist das richtige Weise, dies zu tun?

Was ich versucht:

1 - nicht

order.getOrderItems().stream().flatMap(l -> l.getOrderItemSuborder().stream()).collect(Collectors.toMap(x -> x.getCode() , Function.identity())); // x.getCode() seems to be not available here :( 

2 arbeiten - Arbeits

order.getOrderItems().forEach(x -> x.getOrderItemSuborder().forEach(y -> suborderMap.put(y.getCode(),y))); 

Ich bin nicht sicher, ob # 2 richtige Weg, es zu tun ist.

Wie kann ich # 1 arbeiten lassen?

P.S. : Beginnend mit Lambda-Ausdrücke, könnte eine dumme Frage, aber ich weiß nicht, dass, wenn es: p

+0

verpasst. Ihr "Beispiel" Code für O, A, B ist sehr verwirrend. Ziehen Sie in Erwägung, "echte" Klassen dort zu platzieren, mindestens * vollständige Typen *. Ich habe keine Ahnung, was du mit "a; b;" x; oder y ". Und dann: stellen Sie sicher, Ihre Quellcode-Eingabe richtig zu formatieren, auch wenn es in einer nummerierten Liste! – GhostCat

+0

Vielen Dank für wertvolle Rückmeldung. Ich werde dies für zukünftige Fragen beachten :) –

Antwort

3

Von dem, was ich verstehe, ich glaube, Sie so etwas wie dies

O order; 
order.getAList().stream() 
     .flatMap(a -> a.getBList().stream()) 
     .collect(toMap(b -> b.getCode(), b -> b)); 

benötigen, wenn Sie die erste tun versuchen Sie, was Sie brauchten, war b -> b, ich glaube, Sie haben diesen Teil der Karte im Lambda

+0

danke. Das funktioniert. Aber dann, was ich versuchte, war genau das selbe (ich hatte l, x anstelle von a, b). Es ist die stupide eclipse, die nicht die Methoden der Klasse B auflistte, als ich x versuchte. (Punktoperator). –

+0

im sammeln Sie hatten nur 'toMap (x-> x.getCode(), x)' was Sie brauchten, war 'toMap (x -> x.getCode(), x -> x)' Sie vermisste den zweiten Teil aus – Ash

+0

ich bin Entschuldigung, aber es war dort im Code, verpasste es beim Einfügen hier.Noch Eklipse konnte die Methoden nach Punkt-Operator nicht auflisten .. zeigt Ihre Eclipse das? –

Verwandte Themen