【问题标题】:How to traverse a List of Objects and merge specific value to one big list [closed]如何遍历对象列表并将特定值合并到一个大列表[关闭]
【发布时间】:2022-01-01 07:21:44
【问题描述】:

标题可能听起来令人困惑,但我认为我的问题要简单得多。

这是我所拥有的:

// a List containing `Boat` objects
private final List<Boat> placedBoats;

// each Boat contains a List<Coordinate> which represents a position on a grid
public List<Coordinate> getPosition() {
    return positions;
}

有没有一种方法可以使用流 API 将所有 List&lt;Coordinate&gt; 合并为一个大 List&lt;Coordinate&gt;

【问题讨论】:

  • @Seelenvirtuose 我也这么认为,但是,我现在不知道该怎么做。你能给我一个提示吗?
  • 为什么要特别使用 Stream API?您可以将两个列表附加到一个列表中,而不会产生 Streams 的开销。如果你有一个过滤条件,它是什么?
  • @hfontanez 没有过滤条件。
  • 那为什么要遍历列表呢?穿越时你在寻找什么?
  • @hfontanez “我在找什么?” - 一个包含所有坐标的大列表。我认为流 API 可能是最简单的方法。

标签: java functional-programming java-stream


【解决方案1】:

是的。你可以这样做。

  • 你流着小船。
  • 由于每艘船都有一个坐标列表,因此您必须将它们展平到一个公共流中
  • 然后将坐标收集到一个列表中。
List<Boat> placedBoats ...;
List<Coordinates> coordinates = placedBoats.stream()
           .flatMap(boat->boat.getCoordinates().stream())
           .toList(); // or .collect(Collectors.toList()) if pre java-16

当然,通过上述操作,坐标来源(即个别船只)的来源身份会丢失。

【讨论】:

    【解决方案2】:

    可能的解决方案:

    List<Coordinate> placedBoatCoordinates = new ArrayList<>();
    for (Boat boat : placedBoats) {
        placedBoatCoordinates.addAll(boat.getPosition());
    }
    

    【讨论】:

    • 这不是一个好的解决方案。再次,更好地解释您的问题。并且不要发布您问题的潜在答案。您应该编辑原始问题或发布新问题。
    • @hfontanez 首先,这个答案没有错。它没有按照建议使用流,但它仍然是一种可行的方法。二、请阅读Can I answer my own question?
    • @WJS 我在问题得到澄清之前发布了该评论。我知道任何人都可以回答他们自己的问题。我所说的是不应该发布潜在的答案,因为它们可能不是一个好的答案。这与暗示您无法回答自己的问题不同。事实上,我是第一个问为什么要专门使用流 API,而无需它也能完成同样的任务。
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 2011-10-28
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多