如何使用java stream api根据对象内部存储的信息将对象列表转换为嵌套映射?
我有一个对象列表如何使用java stream api根据对象内部存储的信息将对象列表转换为嵌套映射?,java,date,java-stream,Java,Date,Java Stream,我有一个对象列表list,其中SingleDay是 class SingleDay{ private Date date; private String County; // otherstuff } 我想把这个列表转换成地图。也就是说,我想要一张从日期到县的地图,回到原始对象 例如: 2020年12月2日:{“Rockbridge”:{SingleDayObject} 如果从一个对象列表到一个地图,而不是一个对象列表到一个嵌套的地图,我无法得到任何工作和我在
list
,其中SingleDay
是
class SingleDay{
private Date date;
private String County;
// otherstuff
}
我想把这个列表转换成地图
。也就是说,我想要一张从日期到县的地图,回到原始对象
例如:2020年12月2日:{“Rockbridge”:{SingleDayObject}
如果从一个对象列表到一个地图,而不是一个对象列表到一个嵌套的地图,我无法得到任何工作和我在网上找到的所有东西
基本上,我希望能够快速查询与日期和县相对应的对象
谢谢 按以下步骤操作:
Map<LocalDate, Map<String, SingleDay>> result = list.stream()
.collect(Collectors.toMap(SingleDay::getDate, v -> Map.of(v.getCounty(), v)));
注意:我使用了
LocalDate
而不是过时的java.util.Date
。我强烈建议您使用API,而不是java.util.Date。查看以了解更多信息。一个可读性稍高的数据结构是制作地图。可能看起来是多余的,但这将允许您轻松找到您的对象
Map<SingleDay, SingleDay> myMap = new HashMap();
list.forEach(day -> myMap.put(day, day));
非常重要的一点是,不要忘记覆盖SingleDay
的equals()
方法,基于你认为是相等的。你可以认为你把数据存储在地图中,其中字符串可以是“日期:国家”,而值是单日物件,有可能有“代码>单日< /代码>对象,有重复的<代码>日期<代码>和<代码>国家< /代码>?但我想知道,如果这是意外发生,该如何处理。我是从csv上读的,所以我认为这是可能的,但是如果给定一个日期,我将无法找到相应的单身日。我已经需要它了,对吗?很好的答案+1。我确实收到了以下警告类型不匹配:无法从映射转换到映射
关于使用LocalDate
而不是Date
的好建议,尽管我不太确定您的解决方案的总体情况。预期的结果不应该是类似于list.stream().collect(Collectors.toMap(SingleDay::getDate,v->Map.of(v.getcountry(),v)))的东西吗代码>?或者我从行动标准中漏掉了什么?使用您当前的方法,每个外部地图映射将与内部地图具有相同的值。谢谢,@OusmaneD。为了得到反馈。当我写解决方案时,我不确定这一点,但在看了你的评论之后,我认为这是有意义的。我已采纳了你的建议。如果OP希望得到这个或原始解决方案,我将等待他的评论。@Code_模式实际上这个问题最初并没有用java-8标记。因此我建议Map.of
。最初的答案是根据date
键将整个列表收集到Map
,更新后的答案(感谢@OusmaneD.及时的建议)是将条目的值与键相对应。
Key: 2020-05-27, Value: {Z=SingleDay [date=2020-05-27, County=Z]}
Key: 2020-05-26, Value: {Y=SingleDay [date=2020-05-26, County=Y]}
Key: 2020-05-25, Value: {X=SingleDay [date=2020-05-25, County=X]}
Map<SingleDay, SingleDay> myMap = new HashMap();
list.forEach(day -> myMap.put(day, day));
SingleDay day = mMap.get(myDay);