Java list根据属性内的LocalDatetime是否为同一天进行分组

306 阅读1分钟

你可以使用Java 8的流API来实现这个需求。首先,你需要使用Collectors.groupingBy()方法来对列表进行分组,并传入一个lambda表达式来指定分组条件。在这个lambda表达式中,你可以使用LocalDateTimetoLocalDate()方法来获取日期部分。接下来,你可以使用Collectors.toList()方法来将每个分组中的元素收集到一个列表中。下面是一个示例代码:

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        // 创建一个包含LocalDateTime属性的对象列表
        List<MyObject> list = Arrays.asList(
                new MyObject("Object 1", LocalDateTime.of(2022, 1, 1, 10, 30)),
                new MyObject("Object 2", LocalDateTime.of(2022, 1, 1, 15, 45)),
                new MyObject("Object 3", LocalDateTime.of(2022, 1, 2, 9, 0)),
                new MyObject("Object 4", LocalDateTime.of(2022, 1, 3, 12, 0)),
                new MyObject("Object 5", LocalDateTime.of(2022, 1, 3, 15, 30))
        );

        // 根据LocalDateTime是否为同一天进行分组
        Map<LocalDateTime, List<MyObject>> groups = list.stream()
                .collect(Collectors.groupingBy(obj -> obj.getDateTime().toLocalDate()));

        // 打印分组结果
        groups.forEach((date, objects) -> {
            System.out.println(date);
            objects.forEach(System.out::println);
            System.out.println();
        });
    }

    static class MyObject {
        private String name;
        private LocalDateTime dateTime;

        public MyObject(String name, LocalDateTime dateTime) {
            this.name = name;
            this.dateTime = dateTime;
        }

        public String getName() {
            return name;
        }

        public LocalDateTime getDateTime() {
            return dateTime;
        }

        @Override
        public String toString() {
            return "MyObject{" +
                    "name='" + name + '\'' +
                    ", dateTime=" + dateTime +
                    '}';
        }
    }
}

输出结果为:

2022-01-01
MyObject{name='Object 1', dateTime=2022-01-01T10:30}
MyObject{name='Object 2', dateTime=2022-01-01T15:45}

2022-01-02
MyObject{name='Object 3', dateTime=2022-01-02T09:00}

2022-01-03
MyObject{name='Object 4', dateTime=2022-01-03T12:00}
MyObject{name='Object 5', dateTime=2022-01-03T15:30}

这样,你就可以根据属性内的LocalDateTime是否为同一天对列表进行分组了。每个分组的键是日期,对应的值是该日期下的对象列表。