起初遍历values时直接把对象添加到集合中,后来输出结果和预期不符,debug时发现添加到集合中的对象的值全部是最后一个对象的值,网上百度了下,发现是reduce阶段对象重用的问题,reduce阶段的key,value分别指向一个对象,无论操作了多少个键值对,始终是这两个对象,而ArrayList的add()添加的是对象的引用地址而不是对象的值,这样add(value),当最后一个值遍历完成后,value指向的值就变成了最后一个对象的值,所以如果想要保存key,value的值(属性),需要重新new一个对象进行保存,需要添加到集合中的,应当先new一个对象,拷贝属性后再添加到集合中,不能把直接key,value添加到集合中(除非你的迭代器中只有一个值)

具体可以参考https://my.oschina.net/leejun2005/blog/131744

 1 protected void reduce(Text key, Iterable<TableBean> value,
 2             Reducer<Text, TableBean, TableBean, NullWritable>.Context context) throws IOException, InterruptedException {
 3
 4         List<TableBean>    orderBeanList = new ArrayList<TableBean>();
 5         TableBean pdBean  = new TableBean();
 6
 7         //分拣存储
 8         for (TableBean tableBean : value) {
 9             String name = tableBean.getpName();
10             if(StringUtils.isBlank(name)) {
11                 TableBean bean = new TableBean();
12                 try {
13                     BeanUtils.copyProperties(bean, tableBean);
14                 } catch (IllegalAccessException e) {
15                     e.printStackTrace();
16                 } catch (InvocationTargetException e) {
17                     e.printStackTrace();
18                 }
19                 //orderBean
20                 orderBeanList.add(bean);
21             }else {
22                 try {
23                     BeanUtils.copyProperties(pdBean, tableBean);
24                 } catch (IllegalAccessException e) {
25                     e.printStackTrace();
26                 } catch (InvocationTargetException e) {
27                     e.printStackTrace();
28                 }
29             }
30         }
31
32         //遍历集合进行合并
33         for (TableBean tableBean : orderBeanList) {
34             tableBean.setpName(pdBean.getpName());
35             //写出
36             context.write(tableBean,NullWritable.get());
37         }
38
39     }

转载于:https://www.cnblogs.com/tele-share/p/9674633.html

reduce 阶段遍历对象添加到ArrayList中的问题相关推荐

  1. java arraylist 添加对象_如何在Java中将对象添加到ArrayList

    我想向中添加一个对象ArrayList,但是每次我向ArrayList具有3个属性的新对象添加时objt(name, address, contact),都会出现错误. import java.uti ...

  2. fabric.js对象转json存储并通过json转fabric klass对象添加到画布中

    fabric对象转JSON: JSON对象转fabric对象[klass]: 这个是对于图片对象的 从图片对象JSON转 klass对象 fabric.Rect.fromObject(jsonObje ...

  3. java遍历对象属性_java开发中遍历一个对象的所有属性并set值 缓存优化

    今天技术之家陪你一起了解java开发中遍历一个对象的所有属性并set值 缓存优化: Java反射 1.创建缓存池,可以加快访问速度private static final Map> CACHE  ...

  4. Java程序创建Map集合,创建Emp对象,并将Emp对象添加到集合中(Emp对象的id作为Map集合的键),并将id为015的对象从集合中移除。

    package javase14; /* Emp对象的id作为Map集合的键 */ public class Emp {private String e_id;private String e_nam ...

  5. JS多个对象添加到一个对象中

    var obj1 = {"qq":10}; var obj2={"mm":2,"nn":3}; var obj3={"xx&quo ...

  6. java的对象数组和ArrayList集合

    对象数组 创建Person对象 public class Person {private String name;private int age;public Person() {}public Pe ...

  7. java读取指定位置arraylist,获取元素在Java ArrayList中的位置

    可以使用方法java.util.ArrayList.indexOf()获得ArrayList中元素的位置.此方法返回指定元素首次出现的索引.如果该元素在ArrayList中不可用,则此方法返回-1. ...

  8. java中RIGHT的值_java循环遍历, reduce(),reduceRight()方法和Object,keys遍历对象的属性...

    最近几年,随着高新技术的不断出现,各种编程软件也开始进入到人们的视野当中.今天就来为大家说一下java编程语言的基础知识,也就是java循环遍历, reduce(),reduceRight()方法和O ...

  9. js 遍历对象属性,赋值/添加进另一个对象中

    1. 遍历对象属性,相同属性赋值到另一个对象中 var dataA = {'name':'张三','age':20,'sex':'男' } var dataB = {'name':'李四','age' ...

最新文章

  1. sklearn:Python语言开发的通用机器学习库
  2. 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
  3. Servlet--02--xml文件配置
  4. 初学python还是swift-请问零基础学习python 和swift哪个更好入门呢?
  5. 黄聪:C# 开发Chrome内核浏览器(WebKit.net)
  6. 蓝桥杯java第八届第九题--分巧克力
  7. 51单片机学习笔记(郭天祥版)(4)——练习、动态扫描、练习、数码管消影...
  8. Dell sc1425安装ESXi 5不成功
  9. 第四章:系统困境之 在归因错误下拼命努力
  10. 《计算机组成原理》_学习笔记(二)
  11. 假设mysql数据表t1有字段_使用ROMA Connect集成数据
  12. bootstrap文件不能被识别_Spring Boot 配置文件 bootstrap / application 到底有什么区别?...
  13. C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
  14. 手机上有没有学python的软件-【Learn Python】用手机学Python
  15. 对象序列化(六):应用实例-程序退出时保存状态
  16. 如何使用Deckset配置编辑命令
  17. 自学-Linux-老男孩Linux77期-day5
  18. 台式电脑锁定计算机,电脑锁住了怎么解锁
  19. 机器人布里茨哪个皮肤好看_【图片】【全皮肤鉴赏系列】蒸汽机器人 布里茨【lol半价吧】_百度贴吧...
  20. C# UDP Socket ReceiveFrom 远程主机强迫关闭了一个现有的连接。

热门文章

  1. SonarQube 8.4 发布,分析时间最多可减少 80%
  2. 到 2022 年,75% 的数据库将托管在云端
  3. native下拉图片放大 react_RN下拉图片放大 - Chason-洪的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 射频测试系统软件,新的~~蓝牙5.0射频测试系统
  5. paging library java_Android官方分页组件介绍之Paging的使用详解
  6. 太阳能电池板正负极图_太阳能LED路灯故障原因有哪些?
  7. qt项目出现c4819错误的解决办法
  8. mysql数据库第五章_第五章 数据库的查询
  9. java小数左右移_Java将小数位移至两倍
  10. ionic4 集成极光推送jpush