java 实现内存分页和内存条件查询,通用实现

主要核心类如下:

package com.qijy.collections;

import com.qijy.collections.annotation.DateTime;
import com.qijy.collections.annotation.FiledLike;
import com.qijy.collections.annotation.IgnoreData;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/*
 * @ Description   :  内存分页,R表示条件查询参数,T表示结果
 * @ Author        :  qijy
 * @ CreateDate    :  2021/1/21 10:37
 */
public class ListPageCommon<R,T> {
    // 条件查询参数
    private R r;
    // 总数据
    private List<T> totalList;
    // 条件筛选后数据
    private List<T> resultList;


    public ListPageCommon(R r, List<T> totalList) {
        this.r = r;
        this.totalList = totalList;
        this.resultList = new ArrayList<>();
        filterList();
    }
    /*
     * @ Description   :  获取分页后数据
     * @ Author        :  qijy
     * @ CreateDate    :  2021/1/21 14:48
     */
    public List<T> getListPaged(int currentPage,int pageSize){
        List<T> result = new ArrayList<>();
        int start = (currentPage-1)*pageSize;
        int end = start + pageSize;
        if(end > resultList.size()){
            end = resultList.size();
        }
        result = resultList.subList(start,end);
        return result;
    }
    /*
     * @ Description   :  获取总页数
     * @ Author        :  qijy
     * @ CreateDate    :  2021/1/21 14:48
     */
    public int getToltalPage(int pageSize){
        int size = resultList.size();
        System.out.println("size:"+size);
        int totalPage = size/pageSize+(size%pageSize==0?0:1);
        return totalPage;
    }
    private void filterList(){
        if(null == totalList || totalList.size()==0 ){
            return;
        }
        Field[] fields = r.getClass().getDeclaredFields();
        // 获取字段值不为空的字段和值
        Map<Field, Object> map = getMap(fields);
        if(map.size() == 0){
            resultList.addAll(totalList);
            return;
        }
        List<T> tmplist = null;
        for (Map.Entry<Field, Object> entry : map.entrySet()) {
            Field key = entry.getKey();
            Object value = entry.getValue();
            tmplist = new ArrayList<>();
            for (T t : totalList) {
                try {
                    Field tkey = t.getClass().getDeclaredField(key.getName());
                    tkey.setAccessible(true);
                    Object o = tkey.get(t);
                    if(o == null && tkey.isAnnotationPresent(DateTime.class)){
                        // null 值处理
                        DateTime annotation1 = key.getAnnotation(DateTime.class);
                        Field[] declaredFields = t.getClass().getDeclaredFields();
                        Object o1 = null;
                        for (Field declaredField : declaredFields) {
                            declaredField.setAccessible(true);
                            if(declaredField.isAnnotationPresent(DateTime.class)){
                                DateTime annotation = declaredField.getAnnotation(DateTime.class);
                                if(annotation != null){
                                    if(annotation.name().equals(annotation1.name())&& annotation.type().equals("")){
                                        o1 = declaredField.get(t);
                                    }
                                }
                            }
                        }
                        if (o1 != null){
                            if(betweenDate(value.toString(),o1.toString(),annotation1.type())){
                                tmplist.add(t);
                            }
                        }

                    }else{
                        if(key.isAnnotationPresent(FiledLike.class)){
                            if(o instanceof String){
                                if(o.toString().contains(value.toString())){
                                    tmplist.add(t);
                                }
                            }else if(o instanceof Integer){
                                if((Integer)o==(Integer)value){
                                    tmplist.add(t);
                                }
                            }
                        }else{
                            if(o instanceof String){
                                if(o.toString().equals(value.toString())){
                                    tmplist.add(t);
                                }
                            }else if(o instanceof Integer){
                                if((Integer)o==(Integer)value){
                                    tmplist.add(t);
                                }
                            }
                        }
                    }
                } catch (NoSuchFieldException|IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            totalList.clear();
            totalList = tmplist;
        }
        if(tmplist != null && tmplist.size() > 0){
            resultList.addAll(tmplist);
        }
    }
    /*
     * @ Description   :  时间是否在范围内
     * @ Author        :  qijy
     * @ CreateDate    :  2021/1/21 17:53
     */
    private boolean betweenDate(String value,String o1,String type){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Boolean falg = false;
        try {
            Date date1 = simpleDateFormat.parse(value);
            Date date2 = simpleDateFormat.parse(o1);
            if("start".equals(type)){
                falg = date1.before(date2);
            }else if("end".equals(type)){
                falg = date1.after(date2);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return falg;
    }

    /*
     * @ Description   :  获取值非空的字段
     * @ Author        :  qijy
     * @ CreateDate    :  2021/1/21 13:23
     */
    private Map<Field,Object> getMap(Field[] fields){
        Map<Field, Object> map = new HashMap<>();
        try {
            for (Field field : fields) {
                field.setAccessible(true);
                if(field.isAnnotationPresent(IgnoreData.class)){
                    continue;
                }
                Object o = field.get(r);
                if (o != null) {
                    if (o instanceof String && o.toString().equals("")) {
                        continue;
                    }
                    map.put(field, o);
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return map;
    }
}

通用注解 

package com.qijy.collections.annotation;

import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DateTime {
    String name() default "";
    String type() default "";
}
package com.qijy.collections.annotation;

import java.lang.annotation.*;

/*
 * @ Description   :  判断是否为模糊查询
 * @ Author        :  qijy
 * @ CreateDate    :  2021/1/21 13:28
 */
@Target(ElementType.FIELD)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface FiledLike {

}
package com.qijy.collections.annotation;

import java.lang.annotation.*;

/*
 * @ Description   :  忽略字段注解
 * @ Author        :  qijy
 * @ CreateDate    :  2021/1/22 15:38
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreData {
}

 

测试用例和测试结果

package com.qijy.collections;

import java.util.ArrayList;
import java.util.List;

public class ListPageCommonTest {
    public static void main(String[] args) {
        Request request = new Request();
        request.setStarttime("2021-01-21 12:59:28");
        request.setEndtime("2021-01-21 12:59:35");
        List<Result> list = new ArrayList<>();
        for(int i=0;i<60;i++){
            Result result = new Result(i+"",i+"qijy");
            result.setTime("2021-01-21 12:59:"+i);
            list.add(result);
        }
        ListPageCommon<Request,Result> listPageCommon = new ListPageCommon<>(request,list);
        int toltalPage = listPageCommon.getToltalPage(10);
        List<Result> listPaged = listPageCommon.getListPaged(1,10);
        System.out.println("总页数:"+toltalPage);
        for (Result result : listPaged) {
            System.out.println("id:"+result.getId()+"        name:"+result.getName());
        }
    }

}

size:6
总页数:1
id:29        name:29qijy
id:30        name:30qijy
id:31        name:31qijy
id:32        name:32qijy
id:33        name:33qijy
id:34        name:34qijy

Process finished with exit code 0

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值