Java 8 ParallelStream forEach创建JSONObject时出现错误
问题定位与解决
嘿,我一眼就瞅出问题所在了!你的forEach语法写错啦——parallelStream().forEach()只接受一个lambda表达式参数,但你把两个put操作拆成了两个参数传递,这就导致第二个put里的userlist根本不在有效的作用域里,编译器自然会报错"userlist cannot be resolved"。
修正后的基础写法
把两个put操作放进同一个lambda代码块里,用大括号包裹起来就搞定了:
user_list.parallelStream().forEach(userlist -> { purchaserDetail.put("Purchaser", userlist.getName()); purchaserDetail.put("Purchaser_Email", userlist.getEmail_address()); });
重要提醒:并发安全问题
不过这里得给你提个醒:如果purchaserDetail是普通的JSONObject(比如常用的org.json.JSONObject),它不是线程安全的!并行流是多线程同时执行的,多个线程同时调用put很可能会导致数据覆盖、甚至抛出异常。
针对这个问题,给你两个实用方案:
- 方案1:加同步锁(但会损失并行流的性能优势)
如果必须用同一个purchaserDetail对象,那给put操作加个同步锁,保证同一时间只有一个线程修改它:user_list.parallelStream().forEach(userlist -> { synchronized(purchaserDetail) { purchaserDetail.put("Purchaser", userlist.getName()); purchaserDetail.put("Purchaser_Email", userlist.getEmail_address()); } }); - 方案2:用
map+collect生成独立JSON对象(更推荐)
看你开头说要把JSONObject存入ArrayList,大概率是想给每个用户生成一个独立的详情对象吧?那用Stream的map转换每个用户为JSONObject,再用collect收集到列表里,这既符合Stream API的设计思想,又完全避免了并发问题:import java.util.stream.Collectors; // ... List<JSONObject> purchaserDetailsList = user_list.parallelStream() .map(user -> { JSONObject purchaserDetail = new JSONObject(); purchaserDetail.put("Purchaser", user.getName()); purchaserDetail.put("Purchaser_Email", user.getEmail_address()); return purchaserDetail; }) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

