【问题标题】:How to retrieve nested list from object using Stream API?如何使用 Stream API 从对象中检索嵌套列表?
【发布时间】:2020-11-21 03:40:47
【问题描述】:

你知道如何从TopComplexity 对象中检索所有SimpleProperty 吗? 我需要将该 for 循环 更改为 stream “种类”的代码。

@Data
public class TopComplexity {
   List<SuperComplexProperty> superComplexProperties;
}
@Data
public class SuperComplexProperty {
   List<SimpleProperty> simpleProperties;
   ComplexProperty complexProperty;
}

@Data
public class ComplexProperty {
   List<SimpleProperty> simpleProperties;
}

public class MainClass {
   public static void main(String[] args) {

       TopComplexity top = null;
       List<SimpleProperty> result = new ArrayList<>();
      
       for(SuperComplexProperty prop : top.getSuperComplexProperties) {
          result.addAll(prop.getSimpleProperties());
      
          if(Objects.nonNull(prop.getComplexProperty()) {
              result.addAll(prop.getComplexProperty().getSimpleProperties());
         }
      }
   }
}

非常感谢任何形式的帮助

【问题讨论】:

  • Stream 在这里对减少 for 循环的主体或其可读性没有多大帮助。我的建议是改变对象设计,就像在每个对象中添加“public List flatten()”,它只负责将自己的复杂元素展平/汇总到一个简单的列表中(并将调用嵌套元素的 flatten()转动)。然后你只需要调用“top.flatten()”,它就会返回你想要的所有简单属性。
  • 老实说,这真的很简单,而且是个好主意。非常感谢

标签: java lambda functional-programming java-stream


【解决方案1】:

您可以将flatMap 与涉及Streams 的串联和三元运算符混用,例如:

List<SimpleProperty> result = top.getSuperComplexProperties().stream()
        .flatMap(scp -> Stream.concat(
                scp.getSimpleProperties().stream(),
                scp.getComplexProperty() == null ?
                        Stream.empty() :
                        scp.getComplexProperty().getSimpleProperties().stream()))
        .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多