我在执行for循环时遇到了一些麻烦.循环被调用两次.以下是完成工作的代码:

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,因此我收到两次“呼叫计数134”的输出.这导致列表中出现重复.

以下是POJO:

JSON响应,其中调用foor循环的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:

这是调用方法的地方:

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> 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;

}

有人可以解释为什么这个循环被调用两次导致每个子项在列表中两次?

更新

执行此代码时,我没有重复项:

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列表中的对象被修改两次,因此存在重复项.这就是为什么(@Joakim Danielson)有第二个参数newItem.

另外,我不得不更改TreeBuilder的buildTree方法的签名,以接受由映射器返回的Items列表.

java for loop_Java for循环执行了两次相关推荐

  1. navicat循环执行上下两行相减sql语句_SQL语句的优化分析

    一.开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应 ...

  2. navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!

    - 点击上方"中国统计网"设置⭐星标不迷路!- 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...

  3. java的for的执行顺序_对java for 循环执行顺序的详解

    如下所示: for(表达式1;表达式2;表达式3) { //循环体 } 先执行"表达式1",再进行"表达式2"的判断,判断为真则执行 "循环体&quo ...

  4. 两个嵌套for循环执行顺序

    1.外层判断循环条件,满足进入外循环体,外循环执行 2.内层判断循环条件,满足进入内循环体 3.内循环执行 4.内循环变量累加,回到2执行,直至不满足2 5.外循环变量累加,直至不满足条件,彻底退出循 ...

  5. java while语句打印三角形_【连载】(循环执行语句while和if)乐创DIY C语言讲义——3.8节(3)...

    文 | Edward 2 循环执行语句 计算机有一个强大的能力,快速地重复执行某一计算,这种重复计算多次的方法,是通过软件中的循环执行语句去实现的.C语言中实现循环语句结构的方式有三种,第一种为&qu ...

  6. 两个for循环执行顺序判断,超详细!

    for(int a=1;a<=10;++a) { for(int b=1;b<=5;++b) { console.writeline(a+"\t"+b); } } // ...

  7. Java第二十二篇:详述嵌套for循环执行顺序,小白看了也能懂

    嵌套for循环执行步骤: 1.先判断最外层循环条件,若满足条件则进入第一层循环体;2.进入第一层循环体后进行第二层循环条件判断,若满足判断条件,进入第二层循环体;3.由内而外执行循环体操作:4.执行完 ...

  8. 【Java Web】Quartz定时任务执行两次的解决方法

    问题描述 如果选择定时任务,那么Quartz是一个不错的框架,但是在使用的过程中,莫名发现Quartz定时任务在指定时间被执行了两次. 问题原因 在Tomcat的配置文件conf/server.xml ...

  9. java中能构成循环的语句_《编程导论(Java)#183;3.2.4 循环语句》

    本文全然复制<编程导论(Java)·3.2.4 循环语句>的内容.除[]中的说明文字.请阅读和比較其它编程教材. 我知道.假设我是一个刚開始学习的人,<编程导论(Java)>非 ...

最新文章

  1. 管理7k+工作流,月运行超10000万次,Lyft开源的Flyte平台意味着什么?
  2. Redis 高级教程 Redis 基准(3)
  3. slf4j 使用方法---个人总结
  4. 一个有关ajax去获取天气预报然后用echarts展现出来的小demo
  5. Hadoop、Spark、Hbase、Hive的安装
  6. tensorflow安装教程 win10环境
  7. Android游戏开发基础part4--Bitmap位图的渲染与操作
  8. 计算机考研英语一和英语二的区别,2018考研英语一与英语二翻译有什么区别?怎么提高?...
  9. 数学常用特殊符号读音
  10. 机器学习笔记 - 什么是先验算法(Apriori Algorithm)?
  11. 多元化邮件插图成鲜活生命力,助力邮件营销转化!
  12. 【CTF题解NO.00003】moeCTF 2020 - official write up by arttnba3
  13. html页面其中有添加员工的,编写一个添加员工信息的HTML页面,当用户点击添加按钮,请求AddEmpServlet,实现将用户提交的员工基本信息返回给客户端显示出来。...
  14. 人非生而知之者,智之者,孰能无惑,无过
  15. 前端开发程序员哪些行为会暴露能力不足?
  16. chrome开发者工具网络请求过滤
  17. 校园网电信网双网合一
  18. [C++实现 设计模式(6)] : 代理模式
  19. 6:Eclipse 常用快捷键及源码查看
  20. 没睡够,周末补觉好不好

热门文章

  1. linux进程网络均衡,linux多CPU进程负载均衡解析
  2. History of Microsoft Windows CE
  3. oracle数据库动态拼接查询条件解决方案
  4. Ubuntu下搭建Kubernetes集群(3)--k8s部署
  5. 模块的概念,组建地概念?
  6. Cracer渗透-下载安装软件
  7. php中的parse_ini_file函数
  8. 《Python 数据分析》笔记——pandas
  9. [51nod1079]中国剩余定理
  10. VB6.0连接MySQL数据库