记录一下“BeanUtils.copyProperties()踩的坑;
本人打算使用stream流将BeanObj类按actPrio字段进行排序
直接用下边的这段代码就能实现,感觉so easy
objsList.stream().sorted(Comparator.comparing(BeanObj::getActPrio,
Comparator.nullsFirst(String::compareTo).reversed())).collect(Collectors.toList());
但结果并不是这样,因为actPrio是String类型的字段,排序时只比较第一位的数,排序根本无效,在stream流中也无法对actPrio进行强转。
因此只能在BeanObj中新增一个Integer类型的字段,将actPrio强转后复制给priority
Integer priority
因此就用到了BeanUtils.copyProperties方法。
public class StreamSort {
public static void main(String[] args) {
BeanObj obj1 = new BeanObj();
obj1.setActPrio("1");
BeanObj obj2 = new BeanObj();
obj2.setActPrio("21");
BeanObj obj3 = new BeanObj();
obj3.setActPrio("14");
BeanObj obj4 = new BeanObj();
obj4.setActPrio("201");
BeanObj obj5 = new BeanObj();
obj5.setActPrio("122");
BeanObj obj6 = new BeanObj();
obj6.setActPrio("10");
List<BeanObj> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
list.add(obj3);
list.add(obj4);
list.add(obj5);
list.add(obj6);
List<BeanObj> objsList = new ArrayList<>();
list.stream().filter(Objects::nonNull).forEach(
b -> {
try {
BeanObj obj = new BeanObj();
BeanUtils.copyProperties(b, obj);
if (b.getActPrio() != null) {
Integer priority;
priority = Integer.parseInt(b.getActPrio());
obj.setPriority(priority);
}
objsList.add(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
);
List<BeanObj> beanObjList = objsList.stream().sorted(Comparator.comparing(BeanObj::getPriority,
Comparator.nullsFirst(Integer::compareTo).reversed())).collect(Collectors.toList());
System.out.println(JSONObject.toJSONString(beanObjList));
}
}
但发现输出的结果是空的,调了一下午也没整出来。简直要崩溃了
最后发现,还是对BeanUtils.copyProperties(b, obj)不熟悉,把b,obj搞混了。
调换b,obj位置就可以了。
注意:BeanUtils.copyProperties导入包有两个,
一个是org.springframework.beans.BeanUtils.copyProperties,
一个是org.apache.commons.beanutils.BeanUtils(此次使用的包)
两个包中的方法都可以完成对象中值的复制,但区别是spring中的是将第一个值复制给第二个,apache复制方向相反。
还有一个小点:stream排序对空值的处理,Comparator.nullsFirst和Comparator.nullsLast这两种方法的区别是:nullsFirst是将空值排在最前,nullsLast是将空值排在最后