Java for循环执行两次

时间:2019-01-11 09:26:59

标签: java

执行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响应,其中用于循环循环的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());
    });
});

1 个答案:

答案 0 :(得分:1)

问题出在JsonResponse对象上,该对象始终相同。 JsonResponse列表中的对象被修改了两次,因此存在重复项。这就是为什么(@Joakim Danielson)有第二个参数newItem
另外,我不得不更改TreeBuilder的buildTree方法的签名,以接受Item列表,即由映射器返回的列表。