2017-01-14 4 views
4

Я хочу, чтобы преобразовать следующий код с помощью Java 8 потока APIПреобразования классического вложенного цикла с Java 8 потоками

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

Я вышел с этим

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

, но мне не нравится так как он имеет побочный эффект в списке.

Есть ли другой элегантный способ, создающий список из потока, а может быть?

+1

Что значит «* имеет побочный эффект в списке *»? Что такое побочный эффект? –

+0

Как указано выше, что означает «побочные эффекты»? Также вы можете попытаться просмотреть, можете ли вы перевести оба списка, а затем собрать результат в новом списке. Имейте в виду, что не всегда эффективно использовать потоки, поскольку они имеют тенденцию иметь большие накладные расходы. – Aris

ответ

5

Использование

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

На самом деле это просто декартово произведение. Я привел пример от Cartesian product of streams in Java 8 as stream (using streams only) и адаптирован к вашему делу. Если вы хотите сделать третий цикл внутри, вам нужно использовать код из этого ответа.

+1

Почему бы не вместо этого голосовать, чтобы закрыть вопрос как дубликат. Ответы, найденные в дубликате, являются более подробными и подробными. –

 Смежные вопросы

  • Нет связанных вопросов^_^