如何通过Java Stream将Event列表转换为以EventId.id为键的Map
解决方案
可以通过Java Stream的Collectors.toMap()方法实现需求,具体代码如下:
List<Event> events; Map<Long, Event> eventMap = events.stream() .collect(Collectors.toMap( event -> event.getId().getId(), // 以EventId中的id作为Map的键 Function.identity(), // 直接将Event对象作为Map的值,等价于event -> event (existingEvent, newEvent) -> existingEvent // 处理键重复的情况:保留已有值,可根据需求修改 ));
代码说明
event -> event.getId().getId():从每个Event对象中提取EmbeddedId(即EventId)里的id字段作为Map的键。Function.identity():简化写法,代表直接使用Event对象本身作为Map的值,和event -> event效果一致。- 第三个参数是可选的冲突处理函数:如果列表中存在多个Event对应同一个
EventId.id,这个函数会决定保留哪个值。示例中选择保留先出现的对象,你也可以改成(existing, new) -> new来保留后出现的对象,或者自定义其他逻辑。
如果能保证列表中所有EventId.id都是唯一的,也可以省略第三个参数,简化为:
Map<Long, Event> eventMap = events.stream() .collect(Collectors.toMap( event -> event.getId().getId(), Function.identity() ));
注意:如果省略冲突处理函数且存在重复键,会抛出
IllegalStateException异常。
内容的提问来源于stack exchange,提问作者Dev Dev
相关产品推荐
相关产品推荐

