You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream创建含Optional的Map:按Category取最高优先级ToDo

解决方案:使用Java Stream分组并获取每组优先级最高的ToDo

核心实现代码

import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class ToDoProcessor {
    public static Map<Category, Optional<ToDo>> groupByCategoryAndGetHighestPriority(List<ToDo> todos) {
        return todos.stream()
                // 按Category分组,同时对每组元素取优先级最高的ToDo
                .collect(Collectors.groupingBy(
                        ToDo::category, // 分组键:ToDo的Category属性
                        // 下游收集器:取优先级最小的元素(示例中数值越小优先级越高)
                        Collectors.minBy(Comparator.comparingInt(ToDo::priority))
                ));
    }

    public static void main(String[] args) {
        List<ToDo> todoList = List.of(
                new ToDo("Eat", Category.HOME, 1, LocalDate.of(2022, 8, 29)),
                new ToDo("Sleep", Category.HOME, 2, LocalDate.of(2022, 8, 30)),
                new ToDo("Learn", Category.WORK, 2, LocalDate.of(2022, 9, 3)),
                new ToDo("Work", Category.WORK, 3, LocalDate.of(2022, 10, 3))
        );

        // 输出结果与期望一致
        System.out.println(groupByCategoryAndGetHighestPriority(todoList));
    }
}

// 基础定义
record ToDo(String name, Category category, int priority, LocalDate date) {}
enum Category { HOME, WORK }

关键说明

  1. 下游收集器的使用:
    直接使用Collectors.groupingBy的重载方法,第二个参数传入下游收集器Collectors.minBy,一次性完成分组和每组最值的计算,避免先分组再遍历处理的冗余操作。
  2. 优先级逻辑匹配:
    从示例结果可以看出,优先级数值越小代表优先级越高,因此用minBy配合Comparator.comparingInt(ToDo::priority)获取每组中优先级最高的元素。如果你的业务逻辑是数值越大优先级越高,只需将minBy替换为maxBy即可。
  3. Optional的自动封装:
    Collectors.minBy/maxBy本身会返回Optional<ToDo>,完美匹配你需要的Map<Category, Optional<ToDo>>类型——即使某个Category没有对应的ToDo,也会返回Optional.empty(),保证类型统一。

为什么之前的尝试无法整合?

你之前分开使用groupingBy和sorted().findFirst(),是先将元素分组为Map<Category, List<ToDo>>,再逐个处理每个List。这种方式需要额外的遍历操作,无法在单次collect调用中完成。而通过下游收集器,Stream API可以在分组过程中直接完成每组的元素筛选,代码更简洁高效。

内容的提问来源于stack exchange,提问作者bdream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:42:22