【问题标题】:Converting this nested loop method to a Stream Lambda function将此嵌套循环方法转换为 Stream Lambda 函数
【发布时间】:2018-04-25 14:59:41
【问题描述】:

给定以下带有嵌套for 循环的方法:

private Set<PlanningItem> getPlanningItems(Set<JsonNode> nodes) {
    Set<PlanningItem> planningItems = new HashSet<>();
    for (JsonNode node : nodes) {
      for (JsonNode planningItem : node.findPath(PLANNING_ITEMS.getValue())) {
        planningItems.add(new PlanningItem(planningItem));
      }
    }     
    return planningItems;
  }

我已将其转换为嵌套的forEach 方法,如下所示:

private Set<PlanningItem> getPlanningItems(Set<JsonNode> nodes) {
    Set<PlanningItem> planningItems = new HashSet<>();
    nodes.forEach(node -> node.findPath(PLANNING_ITEMS.getValue()).forEach(planningItem -> planningItems.add(new PlanningItem(planningItem))));
    return planningItems;
}

我很好奇这是否可以使用嵌套流来完成,或者考虑到这种简单的结构以及我们正在使用没有内置流方法的JsonNode 集合这一事实,这是否是最佳选择。

【问题讨论】:

  • map 函数是要走的路

标签: java foreach java-8 jackson java-stream


【解决方案1】:

你需要的是一个平面图,它会将 X 的流转换为 x 的流。

当使用流时,地图和平面地图是你的朋友

对于那些没有 stream() 方法但可以迭代的东西,你也可以这样做

StreamSupport.stream(iterable.spliterator(), false);

例如

nodes.stream() //stream of JsonNode objects
    .flatMap(node -> StreamSupport.stream(node.findPath(PLANNING_ITEMS.getValue()).spliterator(), false)) //stream of JsonNode from the node.findPath
    .map(planningItem-> new PlanningItem(planningItem)) //converts node to PlanningItem
    .collect(Collectors.toSet()); //collects to a set 

【讨论】:

  • OP 已经提到,“我们正在使用没有内置流方法的 JsonNode 集合。”,所以不确定这是否会为他们编译。
  • 没有设置流吗?但至少如果它是可迭代的,你应该能够做这样的事情来获得流StreamSupport.stream(iterable.spliterator(), false);
  • "doesnt set has stream on it",我指的是node.findpath(PLANNING_ITEMS.getValue()).stream()而不是nodes.stream()
  • node.findpath(PLANNING_ITEMS.getValue()) 是可迭代的,但不包含流方法。您能否编辑您的问题以包含该 StreamSupport.stream 并修复 flatMapfindPath 大小写以便我接受?
  • @daniel9x 我已经做出改变了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2020-05-20
  • 2017-02-19
  • 2021-12-30
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多