【问题标题】:How to iterate element in a method after converting to List?转换为List后如何迭代方法中的元素?
【发布时间】:2021-10-10 04:31:06
【问题描述】:

我有以下端点:

public void save(@Valid @RequestBody SaveRequest request) {
    demoService.save(request);
}

SaveRequest 中,我传递了一个productUuid,如下所示。

@Data
public class SaveRequest {

    private UUID productUuid;

    private DetailsRequest detailsRequest;
}

这是我的服务方法:

public void save(final SaveRequest request) {
    detailService.getDetails(request.getProductUuid());

    // code omitted
}

我想做的是;我只想将productUuid 作为列表而不是单个元素传递。 private List<UUID> productUuid;

我以为我可以为SaveRequest中的每个productUuid调用服务方法,而不是使用类似于以下的方法来修改服务方法。然后我从 Controller 调用这个方法,而不是服务的 save 方法。

public void saveList(final SaveRequest request) {
    request.getProductUuidList().stream()
        .map(this::save)
        .collect(Collectors.toList());
}

但我无法使用它。那么,我应该如何解决这个问题呢?如果使用saveListmethood 并为SaveRequest 中的每个productUuid 调用save 方法是一个好方法,那么最好在不更改save 方法的情况下使用它。

【问题讨论】:

  • demoService.save() 接受SaveRequest。使用request.getProductUuidList().stream().map(this::save),您传递给它的是UUID(假设request.getProductUuidList()List<UUID>)。也许处理多个产品的方式是修改服务方法。
  • 是的,这正是问题所在。通常这并不太难,但是由于我必须根据request中的列表的每个元素通过request,所以我失败了。有什么想法吗?
  • 您正在使用collect(Collectors.toList())。你到底想收集什么?
  • 不需要收集,可以省略。只需要根据列表多次调用save方法即可。在这个场景中,我想我应该需要在流中使用索引。真的吗?你的建议是什么?
  • 而不是 stream.map.collect 尝试 forEach 将元素传递给消费者。

标签: java arrays spring list java-stream


【解决方案1】:

现在更新答案。您的上一个答案是正确的,因为 Streams 通常希望您对内部的内容(在您的情况下为 UUID)做一些事情。

如果您不想为 UUID 提供消费者,可以使用 for 循环:

public void saveList(final SaveRequest request) {
  for (UUID uuid: request.getProductUuidList()) {
    save(request);
  }
}

如果您需要当前正在迭代的 UUID,请将保存方法更改为接受 UUID 作为参数

public void saveList(final SaveRequest request) {
  for (UUID uuid: request.getProductUuidList()) {
    save(uuid, request);
  }
}

如您所见,最后一个方法现在有一个 UUID 消费者,因此也可以使用流来完成:

public void saveList(final SaveRequest request) {
  request.getProductUuidList().stream().forEach(
    uuid -> save(uuid, request);
  )
}

在此处使用stream() 是可选的,但可以为您提供有用的功能,例如过滤器。

【讨论】:

  • 好点,感谢您的帮助。我也想过使用List<SaveRequest>,但它没有修复请求中的“List productUuid”。因为当前方法接受SaveRequest,并且没有UUID的列表(它是单个元素)。
  • 我仍然不清楚的事情detailService.getDetails(request.getProductUuid()); 被调用,但从未分配给任何东西。另外,我认为detailService.getDetails(request.getDetailsRequest()); 会更清楚。另外:如果您在请求中的任何地方都没有多个元素,您希望服务如何多次执行某事?在继续之前,您至少需要对模型进行 一些 更改。
  • SaveRequest 包括List<UUID> productUuid; 并且我想将SaveRequest 多次传递给save 方法。如果 List<UUID> productUuid; 中有 5 个元素,那么我需要将 SaveRequest 传递给 save 方法 5 次。
  • 知道了。我的目标是相应地更新我的答案。
  • 在您的场景中,如果您有某种过滤器逻辑或想要对流中的任何内容进行转换,则流可能会有所帮助。例如,假设您在请求中有一些重复的 UUID。你可以做stream().distinct().forEach(...)。如果您只想遍历每个元素,您可以选择不带 Stream 的 forEach
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2018-07-13
  • 1970-01-01
  • 2020-02-04
  • 2014-08-14
  • 1970-01-01
相关资源
最近更新 更多