为了账号安全,请及时绑定邮箱和手机立即绑定

在 java 中展平嵌套的 N 级嵌套对象

在 java 中展平嵌套的 N 级嵌套对象

汪汪一只猫 2022-08-17 15:36:10
我有一个java类class Example{    String field1;    String field2;    List<Example> subExamples;     }在上面的场景中,示例具有子示例,这又是示例列表。此嵌套可以是 n 级。我想实现的是有一个示例列表,即平展上述对象并将所有示例收集到最终列表中(收集所有n级示例)。一种明显的方法是递归。在Java中,有什么方法可以更有效地实现它。我尝试了一些java 8概念,但它们不符合要求。
查看完整描述

3 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

您可以使用的简单方法:


static Stream<Example> flatten(Example ex) {

    if (ex.getSubExamples() == null || ex.getSubExamples().isEmpty()) {

        return Stream.of(ex);

    }


    return Stream.concat(Stream.of(ex), 

                ex.getSubExamples().stream().flatMap(Main::flatten));

}

您可以将其用作


List<Example> flattened = examples.stream()

        .flatMap(Main::flatten) //change class name

        .collect(Collectors.toList());


查看完整回答
反对 回复 2022-08-17
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

例如:


private static Stream<Example> flat(Example example) {

    return Stream.concat(Stream.of(example),

                         example.getSubExamples().stream().flatMap(Sandbox::flat));

}

where 是定义方法的类。Sandboxflat


查看完整回答
反对 回复 2022-08-17
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

这可以通过非递归方式完成:


private Collection<Example> flatten(Example example) {

  Queue<Example> work = new ArrayDeque<>();

  if (example != null) {

    work.offer(example);

  }

  Collection<Example> flattened = new ArrayList<>();

  while(!work.isEmpty()) {

    Example cur = work.poll();

    flattened.add(cur);

    cur.subExamples.forEach(work::offer);

  }

  return flattened;

}


查看完整回答
反对 回复 2022-08-17
  • 3 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信