按日期范围分组

Ed-*_*sis 3 java grouping java-stream

我有这样的情况:

List<ObjectA> collapsed = list.stream().collect(Collectors.collectingAndThen(
        Collectors.groupingBy(
                ObjectA::getDate,
                Collectors.maxBy(Comparator
                        .comparing(ObjectA::getPriority1)
                        .thenComparing(ObjectA::getPriority2)
                        .thenComparing(ObjectA::getDate)
                        .thenComparing(ObjectA::getId))),
        map -> map.values().stream()
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

它对于相同的日期非常有效。我只需要对特定日期窗口的项目进行分组:

Integer daysWindow = 90;
Run Code Online (Sandbox Code Playgroud)

所以我希望这个窗口中的日期一切都发生。这怎么可能?

谢谢大家!

Arv*_*ash 5

您可以在开始时应用过滤器,如下所示,保持其余内容相同。

LocalDate today = LocalDate.now();

list.stream().filter(obj -> !obj.getDate().isAfter(today.plusDays(90)))
    .collect(Collectors.collectingAndThen(....
Run Code Online (Sandbox Code Playgroud)

注意:我假设ObjectA::getDate是类型java.time.LocalDate

演示:

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(inRange(LocalDate.now()));
        System.out.println(inRange(LocalDate.of(2021, 12, 31)));
        System.out.println(inRange(LocalDate.of(2022, 2, 20)));
    }

    static boolean inRange(LocalDate date) {
        return !date.isAfter(LocalDate.now().plusDays(90));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

true
false
false
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大多数java.time功能向后移植到 Java 6 和 7。如果您正在处理 Android 项目和 Android API level 仍然不符合 Java-8,请检查通过脱糖可用的 Java 8+ API以及如何在 Android 项目中使用 ThreeTenABP

  • 请注意,在极端情况下,如果在流式传输时,“LocalDate.now()”的输出因午夜而发生变化,则它可能会过滤掉某些值,而另一些则不会。在这种情况下,*可能*希望在流式传输之前将“LocalDate.now()”的值存储到变量中。 (2认同)
  • @MCEmperor - 感谢您的宝贵反馈。我已经更新了答案以合并它。 (2认同)