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)
所以我希望这个窗口中的日期一切都发生。这怎么可能?
谢谢大家!
您可以在开始时应用过滤器,如下所示,保持其余内容相同。
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)
从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。
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |