java for loop_Java for循环执行了两次
我在執(zhí)行for循環(huán)時遇到了一些麻煩.循環(huán)被調(diào)用兩次.以下是完成工作的代碼:
import java.util.ArrayList;
import java.util.List;
public class PoolItemMapper {
public List mapJsonObjectsToItems(JsonResponse jsonResponse) {
int count = 0;
List itemsList = new ArrayList<>();
List 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,因此我收到兩次“呼叫計數(shù)134”的輸出.這導(dǎo)致列表中出現(xiàn)重復(fù).
以下是POJO:
JSON響應(yīng),其中調(diào)用foor循環(huán)的getItems():
public class JsonResponse {
private String kind;
private String selfLink;
private List items = new ArrayList();
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 getItems() {
return items;
}
public void setItems(List items) {
this.items = items;
}
}
Item類是一個簡單的DTO,只包含變量及其getter / setter:
這是調(diào)用方法的地方:
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調(diào)用:
@Override
public List> buildTree(JsonResponse jsonResponse) {
List> itemTree = new ArrayList<>();
List mappedItems = new PoolItemMapper().mapJsonObjectsToItems(jsonResponse);
for (Item i : mappedItems) {
TreeNode item = new TreeNode<>(i);
if (i.getSubItems().size() > 0) {
for (Item subItem : i.getSubItems()) {
item.addChild(subItem);
}
}
itemTree.add(item);
}
return itemTree;
}
有人可以解釋為什么這個循環(huán)被調(diào)用兩次導(dǎo)致每個子項在列表中兩次?
更新
執(zhí)行此代碼時,我沒有重復(fù)項:
List 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列表中的對象被修改兩次,因此存在重復(fù)項.這就是為什么(@Joakim Danielson)有第二個參數(shù)newItem.
另外,我不得不更改TreeBuilder的buildTree方法的簽名,以接受由映射器返回的Items列表.
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java for loop_Java for循环执行了两次的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人民银行审核未通过原因
- 下一篇: 国庆档电影首日票房破5亿,《我和我的祖国