BeanUtils.copyProperties()

记录一下“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是将空值排在最后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值