2 回答
TA貢獻1900條經驗 獲得超5個贊
你應該使用遞歸。使用流執行此操作的一種可能方法如下:
private Stream<Obj> allObjs() {
return Stream.concat(
Stream.of(this),
objs == null ? Stream.empty() : objs.stream().flatMap(Obj::allObjs));
}
@Override
public String toString() {
return allObjs()
.map(Obj::getobjId)
.collect(Collectors.joining(", "));
}
請注意,只要您的Obj實例以樹狀結構排列,這就會很好地工作。如果您有一個特定Obj實例,它既是某個級別的父項,又是某個較低級別的子項(即,如果您的Obj實例形成圖形),則此解決方案將不起作用,您將獲得一個巨大的StackOverflowError.
如果您不能修改Obj類,則可以使用在類中接收Objie實例的輔助方法來實現相同的效果ObjService:
public static Stream<Obj> allObjs(Obj o) {
if (o == null) return Stream.empty(); // in case the argument is null
return Stream.concat(
Stream.of(o),
o.getObjs() == null ?
Stream.empty() :
o.getObjs().stream().flatMap(ObjService::allObjs));
}
public static String deepToString(Obj o) {
return ObjService.allObjs(o)
.map(Obj::getobjId)
.collect(Collectors.joining(", "));
}
TA貢獻1966條經驗 獲得超4個贊
那么,使用Stream你可以從這里開始:
objs.stream().
map(Obj::getObjId).
forEachOrdered(System.out::println);
并改進一點:
List<String> collect = objs.stream()
.filter(Objects::nonNull) // Filter only nonNull objects. Avoid NullPointerException
.map(Obj::getObjId)
.peek(System.out::println) // Print the ObjId value from Obj
.collect(Collectors.toList()); // Return the result to a List, if you need.
現在你有了從孩子那里獲取價值的基本方法。了解Stream并改進代碼示例;)
添加回答
舉報
