2017-01-14 2 views
4

ich den folgenden Code mit dem Java-8-Stream APIfor-Schleife klassische verschachtelte Konvertieren mit Java 8 Streams

List<Card> deck = new ArrayList<>(); 
for (Suit s: Suit.values()) 
{ 
    for (Rank r: Rank.values()) 
    { 
     deck .add(new Card(r, s)); 
    } 
} 

ich kam mit dieser

List<Card> deck = new ArrayList<>(); 
Arrays.stream(Suit.values()) 
    .forEach(s -> Arrays.stream(Rank.values()) 
     .forEach(r -> deck.add(new Card(r, s)))); 

konvertieren wollen, aber ich weiß nicht wie Es hat einen Nebeneffekt auf der Liste.

Gibt es eine andere elegante Möglichkeit, stattdessen eine Liste aus einem Stream zu erstellen?

+1

Was meinst du "* es hat einen Nebeneffekt auf der Liste *"? Was ist der Nebeneffekt? –

+0

Wie der obige Kommentar zeigt, was bedeutet "Nebenwirkungen"? Sie können auch versuchen zu sehen, ob Sie beide Listen streamen können und dann Ihr Ergebnis in einer neuen Liste sammeln. Bedenken Sie jedoch, dass es nicht immer effizient ist, Streams zu verwenden, da diese einen hohen Verarbeitungsaufwand haben. – Aris

Antwort

5

Verwenden

List<Card> cards = Arrays.stream(Suit.values()) 
       .flatMap(s -> Arrays.stream(Rank.values()).map(r -> new Card(r, s))) 
       .collect(Collectors.toList()); 

Eigentlich ist es einfach cartesianischen Produkt. Ich habe ein Beispiel aus Cartesian product of streams in Java 8 as stream (using streams only) genommen und an Ihren Fall angepasst. Wenn Sie eine dritte Schleife im Inneren machen möchten, müssen Sie Code aus dieser Antwort verwenden.

+1

Warum nicht stattdessen wählen, um die Frage als Duplikat zu schließen. Die Antworten in dem Duplikat sind viel umfassender und detaillierter. –