前言:
使用JDK1.8新加入的Stream的filter方法来实现按条件对集合进行过滤
使用场景:
场景1:
我想得到集合里面的,所有index属性在(30,1,2,3,4,5)中的EmpVo对象。
代码如下:
List<EmpVo> doctors = empByClass.stream().filter(o ->
Arrays.asList(30,1,2,3,4,5).contains(o.getIndex())).collect(Collectors.toList());
场景2:
我想得到集合里面的,所有index属性等于1的EmpVo对象的个数。
Long doctorSum = empLists.stream().filter(
emp -> 1== emp.getIndex()).collect(Collectors.toList()).stream().count();
场景3:
我想集合取出某个字段的集合
List<Integer> groups = list.stream().map(OrgImGroupUser::getOigUid).collect(Collectors.toList());
场景4:
求所有index属性等于1的EmpVo对象的某个属性的和,可以使用如下代码:
Double doctorSum = empLists.stream().filter(
emp -> 1== emp.getIndex())
.collect(Collectors.toList()).stream().mapToDouble(EmpVo::getCount).sum();
场景5:
将符合要求的集合转为map
Map<Integer, Integer> doctors = empByClass.stream().filter(o ->
DOCTORS_SORT_LIST.contains(o.getIndex())).collect(Collectors.toMap(EmpVo::getIndex,
EmpVo::getCount));
场景6:
集合内重复的key值,value值实现累加,部分代码如下:
private List<EmpPerson> getList(List<EmpVo> empLists) {
List<EmpPerson> empVoList = new ArrayList<>();
empLists.forEach(e -> {
EmpPerson p = new EmpPerson();
p.setArea(e.getName());
if (e.getIndex() == DOCTOR_INDEX) {
p.setDoctorNumber(e.getCount());
} else {
p.setNurseNumber(e.getCount());
}
empVoList.add(p);
});
return new ArrayList<>(empVoList.stream().collect(Collectors.toMap(EmpPerson::getArea, a -> a, (o1, o2) -> {
o1.setNurseNumber(o1.getNurseNumber() + o2.getNurseNumber());
o1.setDoctorNumber(o1.getDoctorNumber() + o2.getDoctorNumber());
return o1;
})).values());
}
实现的效果如下:
【去重前】
【去重后】