【问题标题】:Convert classic nested for loop with Java 8 streams [duplicate]使用 Java 8 流转换经典的嵌套 for 循环 [重复]
【发布时间】:2022-01-19 21:14:43
【问题描述】:

我想使用 Java 8 流 API 转换以下代码

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))));

但我不喜欢它,因为它对列表有副作用。

是否有另一种优雅的方式,可以从流中生成列表?

【问题讨论】:

  • 它对列表有副作用”是什么意思?有什么副作用?
  • 正如上面的评论所指出的,“副作用”是什么意思?您也可以尝试查看是否可以流式传输两个列表,然后将结果收集到新列表中。但请记住,使用流并不总是有效的,因为它们往往有很大的处理开销。

标签: java for-loop java-8 java-stream nested-loops


【解决方案1】:

使用

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) 中举了一个例子,并适应了你的情况。如果你想在里面创建第三个循环,你需要使用这个答案中的代码。

【讨论】:

  • 为什么不投票以重复关闭问题。在副本中找到的答案更加全面和详细。
猜你喜欢
  • 2019-04-05
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多