java中List里面的数据怎么筛选

我现在有个List,student实体里面有个createTime字段,如何根据createTime字段筛选出今天、近7天的数据。
不用sql,只能用java!

img


照着改,中间加一个过滤时间的操作就行 filter()

img

LocalDateTime 和 date 都可以照着改


public List<Student> test(List<Student> studentList) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, -7);
        return studentList.stream().filter(student -> student.createTime.after(calendar.getTime())).collect(Collectors.toList());
    }

粗略的写一下吧,你自己再剔除不需要的部分

static class Student{
        private Date date;

        public Date getDate() {
            return date;
        }

        public void setDate(Date date) {
            this.date = date;
        }
    }
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<Student> studentList = new ArrayList<>();
        Student student1 = new Student();
        student1.setDate(new Date());
        Student student2 = new Student();
        student2.setDate(simpleDateFormat.parse("2022-07-15 10:00:00"));
        studentList.add(student1);
        studentList.add(student2);

        List<Student> todayList = studentList.stream().filter(item -> {
            Date date = new Date();
            String today = simpleDateFormat.format(date).split(" ")[0];
            String todayStart = today + " 00:00:00";
            String todayEnd = today + " 23:59:59";
            try {
                Date todayStartDate = simpleDateFormat.parse(todayStart);
                Date todayEndDate = simpleDateFormat.parse(todayEnd);
                return item.getDate().after(todayStartDate) && item.getDate().before(todayEndDate);
            } catch (ParseException e) {
                e.printStackTrace();
                return false;
            }
        }).collect(Collectors.toList());

        List<Student> sevenDayList = studentList.stream().filter(item -> {
            Date date = new Date();
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.DATE, 1);
            date = calendar.getTime();
            String todayEnd = simpleDateFormat.format(date).split(" ")[0] + " 00:00:00";
            calendar.add(Calendar.DATE, -8);
            date = calendar.getTime();
            String sevenDaysAgoEnd = simpleDateFormat.format(date).split(" ")[0] + " 00:00:00";
            try {
                Date sevenDaysAgoEndDate = simpleDateFormat.parse(sevenDaysAgoEnd);
                Date todayEndDate = simpleDateFormat.parse(todayEnd);
                return item.getDate().after(sevenDaysAgoEndDate) && item.getDate().before(todayEndDate);
            } catch (ParseException e) {
                e.printStackTrace();
                return false;
            }
        }).collect(Collectors.toList());

 @Test
    public void test01(){
        Test01 test01 = new Test01();
        test01.setId(1L);
        test01.setCreateTime(DateUtil.parse("2022-07-25"));

        Test01 test02 = new Test01();
        test02.setId(2L);
        test02.setCreateTime(DateUtil.parse("2022-07-30"));

        Test01 test03 = new Test01();
        test03.setId(3L);
        test03.setCreateTime(DateUtil.parse("2022-07-18"));

        List<Test01> test01List = new ArrayList<>();
        test01List.add(test01);
        test01List.add(test02);
        test01List.add(test03);

        List<Test01> list = test01List.stream().filter(e ->
                DateUtil.between(e.getCreateTime(), new Date(), DateUnit.DAY) <= 7).collect(Collectors.toList());
        System.out.println(list);
    }



    public class Test01{
        private Long id;

        private Date createTime;

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public Date getCreateTime() {
            return createTime;
        }

        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }

        @Override
        public String toString() {
            return "Test01{" +
                    "id=" + id +
                    ", createTime=" + createTime +
                    '}';
        }
    }

这是用java8的stream和hutool的日期工具类筛选的,日期工具类不用hutool需要自己实现

records.stream().filter(item-> dayDiff(new Date(),item.getCreateTime()) > 7 && item.getCreateTime().before(new Date())).collect(Collectors.toList());

/**
* a
* 计算两个日期相差的天数,如果date2 > date1 返回正数,否则返回负数
*/
public static long dayDiff(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / 86400000;
}

img


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class T {
    public static void main(String[] args) throws ParseException {
        List<Student> list = new ArrayList<>();
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
        Date beginDate = new Date();
        Calendar date = Calendar.getInstance();
        for (int i = 1; i < 10; i++) {
            date.setTime(beginDate);
            Student s = new Student();
            date.set(Calendar.DATE, date.get(Calendar.DATE) - i);
            Date endDate = dft.parse(dft.format(date.getTime()));
            s.setCreateTime(endDate);
            list.add(s);
        }
        date.setTime(beginDate);
        date.set(Calendar.DATE, date.get(Calendar.DATE) - 7);
        Date endDate = dft.parse(dft.format(date.getTime()));

        List<Student> students = list.stream().filter(student -> !(student.getCreateTime().after(beginDate)) &&
                !(student.getCreateTime().before(endDate))).collect(Collectors.toList());
    }

    static class Student {
        private Date createTime;

        public Date getCreateTime() {
            return createTime;
        }

        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    }
}


package com.valley.jdk.date;

import lombok.Data;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author valley
 * @date 2022/7/18
 * @Description TODO
 */
public class Demo {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<Student> studentList = new ArrayList<>();
        Student student1 = new Student();
        student1.setDate(new Date());
        Student student2 = new Student();
        student2.setDate(simpleDateFormat.parse("2022-07-15 10:00:00"));
        studentList.add(student1);
        studentList.add(student2);

        List<Student> todayList =new ArrayList<>();
        List<Student> sevenDayList =new ArrayList<>();

        Date date = new Date();
        String today = simpleDateFormat.format(date).split(" ")[0];
        String todayStart = today + " 00:00:00";
        String todayEnd = today + " 23:59:59";
        Date todayStartDate = simpleDateFormat.parse(todayStart);
        Date todayEndDate = simpleDateFormat.parse(todayEnd);


        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, 1);
        String todayEnd2 = simpleDateFormat.format(calendar.getTime()).split(" ")[0] + " 00:00:00";
        calendar.add(Calendar.DATE, -8);
        String sevenDaysAgoEnd = simpleDateFormat.format(calendar.getTime()).split(" ")[0] + " 00:00:00";

        Date sevenDaysAgoEndDate = simpleDateFormat.parse(sevenDaysAgoEnd);
        Date todayEndDate2 = simpleDateFormat.parse(todayEnd2);


        for(Student student:studentList){
            Date dat=student.getDate();
            if(dat.after(todayStartDate) && dat.before(todayEndDate)){
                todayList.add(student);
            }else if(dat.after(sevenDaysAgoEndDate) && dat.before(todayEndDate2)){
                sevenDayList.add(student);
            }
        }

    }
}

@Data
class Student{
    private Date date;
}

使用Java的lamda表达式。

如果是Springboot项目,可以结合mybatis-plus这个ORM框架,轻松实现数据查询功能。

遍历判断创建时间是否为近七天,如果是则记录到近七天list并且判断是否今天,如果是则同步记录到今天List。

完整代码如下:

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        Student s1 = new Student();
        // 今天
        s1.setCreateTime(LocalDateTime.now());
        Student s2 = new Student();
        // 昨天
        s2.setCreateTime(LocalDateTime.now().minusDays(1));
        list.add(s1);
        list.add(s2);

        // 今天的数据
        LocalDateTime todayBegin = LocalDate.now().atStartOfDay();
        LocalDateTime todayEnd = LocalDate.now().atStartOfDay().plusDays(1).minusNanos(1);
        List<Student> todayList = list.stream().filter(s -> s.getCreateTime().isBefore(todayEnd) && s.getCreateTime().isAfter(todayBegin)).collect(Collectors.toList());
        System.out.println(todayList);

        // 近7天的数据
        LocalDateTime day7Begin = LocalDate.now().minusDays(6).atStartOfDay();
        LocalDateTime day7End = LocalDate.now().atStartOfDay().plusDays(1).minusNanos(1);
        List<Student> day7List = list.stream().filter(s -> s.getCreateTime().isBefore(day7End) && s.getCreateTime().isAfter(day7Begin)).collect(Collectors.toList());
        System.out.println(day7List);

    }

    public static class Student {

        /**对应数据库的日期字段*/
        private LocalDateTime createTime;

        public LocalDateTime getCreateTime() {
            return createTime;
        }

        public void setCreateTime(LocalDateTime createTime) {
            this.createTime = createTime;
        }

        @Override
        public String toString() {
            return createTime.toString();
        }
    }

运行结果如下:

Connected to the target VM, address: '127.0.0.1:38188', transport: 'socket'
[2022-07-19T08:38:54.452170600]
[2022-07-19T08:38:54.452170600, 2022-07-18T08:38:54.452170600]
Disconnected from the target VM, address: '127.0.0.1:38188', transport: 'socket'

img

演示的代码中,有一条当天的数据,一条昨天的数据,
演示的结果,当天数据打印了一条,近7天的数据打印了2条

如有帮助,请采纳,十分感谢!

一种比较简单的方法是使用 for循环遍历列表并使用条件语句对其进行过滤,这种方法创建了一个单独的List,用于存储过滤选中的元素。如下所示。

 List<String> dataList= Arrays.asList("123","123222","2323","6767");
List<String> resultList = new ArrayList<>();
        for (String entry: dataList)
        {
           
            if (entry.startsWith("12")) {
                resultList.add(entry);
            }
        }
        System.out.println(resultList);

我们还可以使用迭代器过滤,这种方式不需要再次创建一个List。
下面的代码使用Iterator类提供的remove()方法来过滤列表元素。需要注意的是,如果使用 List的remove() 方法,则会抛出ConcurrentModificationException错误,因为在List中遍历时,是不允许动态删除列表中的元素的。


        List<String> dataList = new ArrayList<>(Arrays.asList("123","123222","2323","6767"));
        Iterator<String> iterator= dataList.iterator();
        while (iterator.hasNext())
        {
            String temp = iterator.next();
            if (!temp.startsWith("12")) {
               iterator.remove();
            }
        }
        System.out.println(dataList);
  


1.这个问题,主要就是时间类型如何进行比较,利用StreamAPI中的filter()过滤即可.


    /**
     * 我现在有个List,student实体里面有个createTime字段,如何根据createTime字段筛选出今天、近7天的数据。
     */
    @Test
    public void testDemo() {
        // 创建一些学生数据
        Stu stu1 = new Stu(1, "张三", LocalDateTime.now());
        Stu stu2 = new Stu(2, "李四", LocalDateTime.now().minusDays(1L));
        Stu stu3 = new Stu(3, "王五", LocalDateTime.now().minusDays(2L));
        Stu stu4 = new Stu(3, "钱六", LocalDateTime.now().minusDays(10L));
        List<Stu> stuList = Arrays.asList(stu1, stu2, stu3, stu4);
        // 获取今天的数据
        List<Stu> collect = stuList.stream().filter(e -> e.getCreateTime().compareTo(LocalDateTime.now()) == 0).collect(
            Collectors.toList());
        // 结果输出
        System.out.println("今天刚创建的用户是:" + collect);
        System.out.println("----------------------------------------------------------------------------");
        // 设置时间范围 例如今天2022/7/19,那么过去7天的范围应是: 2022-07-11 00:00:00 ~ 2022-07-18 23:59:59
        LocalDateTime startTime = LocalDateTime.now().minusDays(1L).withHour(23).withMinute(59).withSecond(59);
        LocalDateTime endTime = LocalDateTime.now().minusDays(8L).withHour(0).withMinute(0).withSecond(0);
        // 获取过去7天的结果 -> 逻辑推导出 endTime<= createTime <= startTime
        // a.compareTo(b) 如果,a>b 返回1;如果a=b,返回0;如果a<b,返回-1
        List<Stu> collect1 = stuList.stream().filter(
            e -> startTime.compareTo(e.getCreateTime()) >= 0 && endTime.compareTo(e.getCreateTime()) <= 0).collect(
            Collectors.toList());
        System.out.println("过去七天的用户是:" + collect1);
    }

遍历List,拿到createTime的值,然后进行时间比较呃,so easy

用java8,转成stream来筛选,很好操作的

最笨的办法 for循环遍历整个数组 每个对象都取出时间来判断 今天、近七天 符合就加到另一个数组里

用stream流方便