java中操作Stream流进行匹配查询

上一篇讲到如何用Specification进行复杂查询,这篇就简单说下本人更喜欢的操作Strem进行复杂查询。

话不多说,先上代码:

 //自定义条件查询
            Long proId = ParamUtil.getLongParameter(entity.getProjectId(), -1L);
           //定义匹配字段
            String numberOrname = entity.getNumberOrname();
            String costCategory = entity.getCostCategory();
            String contractMoneyMin = entity.getContractMoneyMin();
            String contractMoneyMax = entity.getContractMoneyMax();
            List<ContractInfoBean> list = contractInfoRepo.findAllByProjectIdAndType(proId, type1);
			//获取list的流,进行逐条bean的匹配操作  这里需要重写test方法
            List<ContractInfoBean> fileProjectList = list.stream().filter(new java.util.function.Predicate<ContractInfoBean>() {
                @Override
                public boolean test(ContractInfoBean bean) {
				*******************
				下面就可以完全以写代码的形式设置字段匹配机制
				*******************
                    //合同名称或编号
                    if (StringUtil.isNotEmpty(numberOrname)) {
                        if (!bean.getName().contains(numberOrname) && !bean.getNumber().contains(numberOrname)) {
                            return false;
                        }
                    }

                    //费用类别
                    if (StringUtil.isNotEmpty(costCategory)) {
                        String costTypeArray = bean.getCostTypeArray();
                        String[] costArray = StringUtil.split(costTypeArray, ",");
                        if (costArray.length < 4) {
                            return false;
                        }
                        if (!costCategory.equals(costArray[3])) {
                            return false;
                        }
                    }

                    // 合同金额比较
                    Double total = bean.getTotalContractAmount();
                    if (total == null) {
                        total = 0.0;
                    }
                    if (StringUtils.isNotBlank(contractMoneyMin)) {
                        if (total < Double.parseDouble(contractMoneyMin)) {
                            return false;
                        }
                    }
                    if (StringUtils.isNotBlank(contractMoneyMax)) {
                        if (total > Double.parseDouble(contractMoneyMax)) {
                            return false;
                        }
                    }
                    return true;
                }
            }).collect(Collectors.toList());

以上就是通过操作Stream完成匹配查询的设定方式,十分简单有效,不过需要注意的是:

***返回值是Boolean类型,如果该条数据不符合条件,直接return false,就可以将该条数据直接剔除,如果符合条件就返回true,在设置匹配条件时,还可以直接对过滤list中的对象,进行操作,因此我个人更喜欢使用这种方式进行JPA中的复杂搜索。

我相信还有更简便的方法,等待我去发现、学习,学海无涯,让我们共同努力!早日成为一名“聪明绝顶”的程序猿<( ̄3 ̄)> !

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值