reduce 阶段遍历对象添加到ArrayList中的问题
起初遍历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中的问题相关推荐
- java arraylist 添加对象_如何在Java中将对象添加到ArrayList
我想向中添加一个对象ArrayList,但是每次我向ArrayList具有3个属性的新对象添加时objt(name, address, contact),都会出现错误. import java.uti ...
- fabric.js对象转json存储并通过json转fabric klass对象添加到画布中
fabric对象转JSON: JSON对象转fabric对象[klass]: 这个是对于图片对象的 从图片对象JSON转 klass对象 fabric.Rect.fromObject(jsonObje ...
- java遍历对象属性_java开发中遍历一个对象的所有属性并set值 缓存优化
今天技术之家陪你一起了解java开发中遍历一个对象的所有属性并set值 缓存优化: Java反射 1.创建缓存池,可以加快访问速度private static final Map> CACHE ...
- 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 ...
- JS多个对象添加到一个对象中
var obj1 = {"qq":10}; var obj2={"mm":2,"nn":3}; var obj3={"xx&quo ...
- java的对象数组和ArrayList集合
对象数组 创建Person对象 public class Person {private String name;private int age;public Person() {}public Pe ...
- java读取指定位置arraylist,获取元素在Java ArrayList中的位置
可以使用方法java.util.ArrayList.indexOf()获得ArrayList中元素的位置.此方法返回指定元素首次出现的索引.如果该元素在ArrayList中不可用,则此方法返回-1. ...
- java中RIGHT的值_java循环遍历, reduce(),reduceRight()方法和Object,keys遍历对象的属性...
最近几年,随着高新技术的不断出现,各种编程软件也开始进入到人们的视野当中.今天就来为大家说一下java编程语言的基础知识,也就是java循环遍历, reduce(),reduceRight()方法和O ...
- js 遍历对象属性,赋值/添加进另一个对象中
1. 遍历对象属性,相同属性赋值到另一个对象中 var dataA = {'name':'张三','age':20,'sex':'男' } var dataB = {'name':'李四','age' ...
最新文章
- sklearn:Python语言开发的通用机器学习库
- 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
- Servlet--02--xml文件配置
- 初学python还是swift-请问零基础学习python 和swift哪个更好入门呢?
- 黄聪:C# 开发Chrome内核浏览器(WebKit.net)
- 蓝桥杯java第八届第九题--分巧克力
- 51单片机学习笔记(郭天祥版)(4)——练习、动态扫描、练习、数码管消影...
- Dell sc1425安装ESXi 5不成功
- 第四章:系统困境之 在归因错误下拼命努力
- 《计算机组成原理》_学习笔记(二)
- 假设mysql数据表t1有字段_使用ROMA Connect集成数据
- bootstrap文件不能被识别_Spring Boot 配置文件 bootstrap / application 到底有什么区别?...
- C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
- 手机上有没有学python的软件-【Learn Python】用手机学Python
- 对象序列化(六):应用实例-程序退出时保存状态
- 如何使用Deckset配置编辑命令
- 自学-Linux-老男孩Linux77期-day5
- 台式电脑锁定计算机,电脑锁住了怎么解锁
- 机器人布里茨哪个皮肤好看_【图片】【全皮肤鉴赏系列】蒸汽机器人 布里茨【lol半价吧】_百度贴吧...
- C# UDP Socket ReceiveFrom 远程主机强迫关闭了一个现有的连接。
热门文章
- SonarQube 8.4 发布,分析时间最多可减少 80%
- 到 2022 年,75% 的数据库将托管在云端
- native下拉图片放大 react_RN下拉图片放大 - Chason-洪的个人空间 - OSCHINA - 中文开源技术交流社区...
- 射频测试系统软件,新的~~蓝牙5.0射频测试系统
- paging library java_Android官方分页组件介绍之Paging的使用详解
- 太阳能电池板正负极图_太阳能LED路灯故障原因有哪些?
- qt项目出现c4819错误的解决办法
- mysql数据库第五章_第五章 数据库的查询
- java小数左右移_Java将小数位移至两倍
- ionic4 集成极光推送jpush