簡體   English   中英

Java for循環執行兩次

[英]Java for loop executed twice

我在執行for循環時遇到一些麻煩。 該循環被調用兩次。 這是完成工作的代碼:

import java.util.ArrayList;
import java.util.List;

public class PoolItemMapper {
    public  List<Item> mapJsonObjectsToItems(JsonResponse jsonResponse) {
        int count = 0;
        List<Item> itemsList = new ArrayList<>();
         List<Item> js = jsonResponse.getItems();
        for (Item item : jsonResponse.getItems()) {
            itemsList.add(addNormalItemProperties(item, new Item()));
            count++;
        }
        System.out.println("Call count: " + count);
        return itemsList;
    }

    private  Item addNormalItemProperties(Item oldItem, Item newItem) {
        if(oldItem.getMembersReference().getItems().size() <=  0) {
            return oldItem;
        } else if (oldItem.getMembersReference().getItems().size() > 0) {
            for (SubItem subItem: oldItem.getMembersReference().getItems()) {
                oldItem.getSubItems().add(creteNewSubItem(subItem));
            }
        }
        return oldItem;
    }

    private  Item creteNewSubItem(SubItem oldItem) {
        Item i = new Item();
        i.setDynamicRatio(oldItem.getDynamicRatio());
        i.setEphermal(oldItem.getEphermal());
        i.setInheritProfile(oldItem.getInheritProfile());
        i.setLogging(oldItem.getLogging());
        i.setRateLimit(oldItem.getRateLimit());
        i.setRatio(oldItem.getRatio());
        i.setSession(oldItem.getSession());
        i.setAddress(oldItem.getAddress());
        i.setName(oldItem.getName());
        i.setState(oldItem.getState());

        return i;
    }

}

該列表的大小為134,因此我收到的輸出是“呼叫計數134”的兩倍。 這導致列表中有重復項。
以下是POJO:

JSON響應,其中用於foor循環的getItems()稱為:

public class JsonResponse {
    private String kind;
    private String selfLink;
    private List<Item> items = new ArrayList<Item>();

    public JsonResponse() {

    }

    public String getKind() {
        return kind;
    }

    public void setKind(String kind) {
        this.kind = kind;
    }

    public String getSelfLink() {
        return selfLink;
    }

    public void setSelfLink(String selfLink) {
        this.selfLink = selfLink;
    }

    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }
}

Item類是一個簡單的DTO,僅包含變量及其獲取器/設置器:
這是調用方法的地方:

itemTree = new PoolTreeBuilderImpl().buildTree(j);

itemTree.stream().forEach(i -> {
    System.out.println("[PARENT] " + i.getData().toString());
    i.getData().getSubItems().stream().forEach(si -> {
        System.out.println("       [CHILD] " + si.toString());
    });
});

}

PoolTreeBuilderImpl調用:

@Override
public List<TreeNode<Item>> buildTree(JsonResponse jsonResponse) {
    List<TreeNode<Item>> itemTree = new ArrayList<>();
    List<Item> mappedItems = new PoolItemMapper().mapJsonObjectsToItems(jsonResponse);
    for (Item i : mappedItems) {
        TreeNode<Item> item = new TreeNode<>(i);
        if (i.getSubItems().size() > 0) {
            for (Item subItem : i.getSubItems()) {
                item.addChild(subItem);
            }
        }
        itemTree.add(item);
    }
    return itemTree;
}

有人可以解釋一下為什么這個循環被調用兩次,導致每個子項在列表中兩次嗎?

更新資料
執行此代碼時,我沒有重復的代碼:

List<Item> mappedItems = new PoolItemMapper().mapJsonObjectsToItems(jsonResponse);
mappedItems.forEach(i -> {
    System.out.println("[PARENT] " + i.toString());
    i.getMembersReference().getItems().forEach(s -> {
        System.out.println("      [CHILD] " + s.toString());
    });
});

問題出在JsonResponse對象上,該對象始終是相同的。 JsonResponse列表中的對象被修改了兩次,因此存在重復項。 這就是為什么(@Joakim Danielson)有第二個參數newItem
另外,我不得不更改TreeBuilder的buildTree方法的簽名以接受Item的列表,該列表由映射器返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM