我有一个嵌套类列表。我可以使用流来遍历它们吗,当条件为真时,我需要打印所有值。
输入:列出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;
}
答案 0 :(得分:0)
当然可以。
注意:我从您的问题中了解到,您想打印ObjD对象内部所有对象的所有字段,其中ObjD.d1 + ObjD.d2等于某个特定的总和。希望我能正确理解您的查询。
使用Streams API的filter方法实际上很容易实现。
代码将如下所示:
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等于和的对象。
此外,我们可以简单地使用forEach()方法遍历每个列表,并根据您的喜好以所需的任何顺序打印变量。
在这里,我首先打印ObjAS的最里面的列表,然后打印ObjBS,ObjCS和ObjDS。
您可以根据需要更改订单。
答案 1 :(得分:0)
我认为您需要详细说明您的要求。以我的理解,您不能只打印<input focus>
,而要在abcd
下打印整个树。乍一看,我能想到的最平坦的方法是:
d
您可能想考虑使用一些通用的超类来使此代码减少冗余(composite pattern)。您还可以编写一种相互调用的打印方法(例如,调用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));
,先打印objD.print()
和d1
,然后再调用d2
。 )。 Tree traversal algorithms也可能是一本好书。