//创建一个null 的list集合
List<MemberInterestsVo> aVos = new ArrayList<>();
pointsLevels.forEach(a -> {
MemberInterestsVo memberCentreVo = new MemberInterestsVo();
//过滤等级id
List<BenefitsVo> collect = BenefitsVos.stream().filter(x -> x.getLevelId() == a.getId()).collect(Collectors.toList());
List<BenefitsVo> benefitsVo1 = new CopyOnWriteArrayList();
for (BenefitsVo benefitsVo : collect) {
if (language.equals("zh-CN")){
benefitsVo.setInterestsName(benefitsVo.getInterestsName());
}else if (language.equals("zh-TW")){
benefitsVo.setInterestsName(benefitsVo.getInterestsNameCht());
}else if (language.equals("en-US")) {
benefitsVo.setInterestsName(benefitsVo.getInterestsNameEn());
}
benefitsVo1.add(benefitsVo);
}
使用 CopyOnWriteArrayList (读写分离的思想)
为什么使用 CopyOnWriteArrayList
源码分析 add、rome元素时,上锁保证同一时刻最多只有一个线程向list中添加元素,肯定是线程安全的, 同时add、rome都是不会去修改
原数组的,所以modCount 是不会去被其他线程改变的。
CopyOnWriteArrayList 在数组的迭代时也可防止并发修改异常就是我上面代码块里面写的,如果在代码快里面使用了forEcah,里面在使用for循环很容易出现并发修改异常。给新的要修改的实体塞进一个CopyOnWriteArrayList 的list数组中,可以解决。