亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Java 流打印嵌套列表,其中對象包含對自身的引用列表

如何使用 Java 流打印嵌套列表,其中對象包含對自身的引用列表

米琪卡哇伊 2021-11-17 10:33:54
我有一個類似于下圖所示的對象:public class Obj {  private List<Obj> objs;  private String objId;  public List<Obj> getObjs() {    return objs;  }  public String getobjId() {    return objId;  }  @Override  public String toString() {    return "Obj [objs=" + objs + ", objId=" + objId + "]";  }}如何打印objId使用流的列表?編輯Obj可以包含一個 Obj 列表,它的子級可以包含一個 obj 對象列表。如果深度為5級,是否可以將所有objId值從最頂部的obj打印到第5級的孩子的值。我想避免嵌套 for 循環。
查看完整描述

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(", "));

}


查看完整回答
反對 回復 2021-11-17
?
慕標5832272

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并改進代碼示例;)


查看完整回答
反對 回復 2021-11-17
  • 2 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號