【问题标题】:Best way to convert a double loop to stream将双循环转换为流的最佳方法
【发布时间】:2022-12-20 08:09:08
【问题描述】:

我有以下 for 循环:

List<Player> players = new ArrayList<>();
for (Team team : teams) {
   ArrayList<TeamPlayer> teamPlayers = team.getTeamPlayers();
   for (teamPlayer player : teamPlayers) {
       players.add(new Player(player.getName, player.getPosition());
   }
}

我正在尝试将其转换为 Stream:

List<Player> players = teams.forEach(t -> t.getTeamPlayers().forEach(p -> players.add(new Player(p.getName(), p.getPosition()))));

但我收到一个错误,变量“玩家”可能尚未初始化 为什么会这样?还有更好的方法来创建流吗?平面图会更好吗?

【问题讨论】:

  • 你能用流添加完整的代码吗,在第二种情况下是否存在List&lt;Player&gt; players = new ArrayList&lt;&gt;();
  • 如果我添加 List&lt;Player&gt; players = new ArrayList&lt;&gt;(); 我得到: Lambda 表达式中使用的变量应该是最终的或有效的最终的

标签: java stream java-stream


【解决方案1】:

首先,您需要了解 Streams就像循环一样。

因此,不要试图模仿循环。检查 API 提供的工具。 Operation forEach() 用于需要执行的特殊情况副作用,不是以便将流中的元素累积到 Collection 中。

为了对流进行缩减,我们有几个专门的操作,如collectreduce等(有关更多信息,请参阅API documentation - Reduction).

collect() 操作旨在执行可变减少。您可以通过提供内置 Collector toList() 作为参数来将数据收集到列表中。并且由于 Java 16 操作 toList() 被引入 API。

List<Team> teams = List.of();

List<Player> players = teams.stream()                // Stream<Team>
    .flatMap(team -> team.getTeamPlayers().stream()) // Stream<Player>
    .map(player -> new Player(player.getName(), player.getPosition()))
    .toList(); // for Java 16+ or collect(Collectors.toList())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多