【问题标题】:Is it possible to do so?有可能这样做吗?
【发布时间】:2019-07-03 15:56:37
【问题描述】:

我有一个嵌套类列表。我可以使用流来遍历它们吗?当条件为真时,我需要打印所有值。

输入:列出 ObjDS;

我们可以使用流来遍历而不是使用循环或迭代器,并且当每个 Obj4 的 d1 + d2 等于某个数字(比如 10)时,然后打印 a1,a2,b1,b2,c1,c2,d1 ,d2 的层次结构。

有可能与流有关吗?

public class ObjA {
    int a1;
    int a2;
}

public class ObjB {
    int b1;
    int b2;
    List<ObjA> objAS;
}

public class ObjC {
    int c1;
    int c2;
    List<ObjB> objBS;
}

public class ObjD {
    int d1;
    int d2;
    List<ObjC> objCS;
}

【问题讨论】:

    标签: java stream java-stream


    【解决方案1】:

    当然,这是可能的。

    注意:我从您的问题中了解到,您想要打印 ObjD 对象内所有对象的所有字段,其中 ObjD.d1 + ObjD.d2 等于某个特定的总和。希望我正确理解了您的查询。

    使用 Streams API 中的过滤器方法实际上很容易实现这一点。

    代码如下所示:

    int sum = 10;
    objDS.stream()
         .filter(objD -> objD.d1 + objD.d2 == sum)
         .forEach(objD -> {
             List<ObjC> objCS = objD.objCS;
             objCS.forEach(objC -> {
                 List<ObjB> objBS = objC.objBS;
                 objBS.forEach(objB -> {
                     List<ObjA> objAS = objB.objAS;
                     objAS.forEach(objA -> {
                         System.out.println("ObjA.a1: " + objA.a1);
                         System.out.println("ObjA.a2: " + objA.a2);
                     });
                     System.out.println("ObjB.b1: " + objB.b1);
                     System.out.println("ObjB.b2: " + objB.b2);
                 });
                 System.out.println("ObjC.c1: " + objC.c1);
                 System.out.println("ObjC.c1: " + objC.c1);
             });
             System.out.println("ObjD.d1: " + objD.d1);
             System.out.println("ObjD.d2: " + objD.d2);
         });
    

    在这里,我使用 sum 变量来检查您提到的条件。一旦过滤了 ObjD 列表,我们就只有 ObjD.d1 + ObjD.d2 等于 sum 的对象。

    此外,我们可以简单地使用 forEach() 方法遍历每个列表,并根据您的喜好以您想要的任何顺序打印变量。

    在这里,我首先打印最里面的 ObjAS 列表,然后是 ObjBS、ObjCS 和 ObjDS。

    您可以根据需要更改顺序。

    【讨论】:

      【解决方案2】:

      我认为您需要更详细地说明您的要求。据我了解,您不能只打印abcd,而是想在d 下打印一整棵树。乍一看我能想到的最扁平的方式是这样的:

      ds  .stream()
          .filter(d -> d.d1 + d.d2 == sum)
          .peek(d -> System.out.println(d.d1 + " " + d.d2))
          .flatMap(d -> d.objCS.stream())
          .peek(c -> System.out.println(" " + c.c1 + " " + c.c2))
          .flatMap(c -> c.objBS.stream())
          .peek(b -> System.out.println("  " + b.b1 + " " + b.b2))
          .flatMap(b -> b.objAS.stream())
          .forEach(a -> System.out.println("   " + a.a1 + " " + a.a2));
      

      您可能想要考虑使用一些常见的超类来减少此代码的冗余(composite pattern)。您还可以编写一个相互调用的打印方法(例如,您调用objD.print(),它打印d1d2,然后调用objCS.foreach(ObjC::print()),这反过来......)。 Tree traversal algorithms 也可能是一本好书。

      【讨论】:

        猜你喜欢
        • 2012-02-19
        • 2017-11-30
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 2016-12-07
        相关资源
        最近更新 更多