我处于一种奇怪的情况下,有一个JSON API,需要一个字符串数组来作为键,和一个餐厅字符串数组作为值。这些值会被GSON解析成一个“餐厅对象”,该对象定义了一个代表社区的字符串和一个包含餐厅名称的列表。系统将这些数据存储在一个映射中,其中键是社区名称,值是该社区内餐厅名称的集合。因此,我想实现一个函数,它可以从API输入中获取数据并按社区分组,并将餐厅列表连接起来。
由于受Java 8的限制,我无法使用更高级的功能(如flatMapping)在一行代码中完成所有操作。我找到的最佳解决方案是使用一个中间映射来存储List的集合,然后将这些列表连接成一个集合,并将它们作为值存储在最终映射中。
由于受Java 8的限制,我无法使用更高级的功能(如flatMapping)在一行代码中完成所有操作。我找到的最佳解决方案是使用一个中间映射来存储List的集合,然后将这些列表连接成一个集合,并将它们作为值存储在最终映射中。
public Map<String, Set<String>> parseApiEntriesIntoMap(List<Restaurant> restaurants) {
if(restaurants == null) {
return null;
}
Map<String, Set<String>> restaurantListByNeighborhood = new HashMap<>();
// Here we group by neighborhood and concatenate the list of restaurants into a set
Map<String, Set<List<String>>> map =
restaurants.stream().collect(groupingBy(Restaurant::getNeighborhood,
Collectors.mapping(Restaurant::getRestaurantList, toSet())));
map.forEach((n,r) -> restaurantListByNeighborhood.put(n, Sets.newHashSet(Iterables.concat(r))));
return restaurantListByNeighborhood;
}
我觉得一定有办法摆脱中间的map,把所有操作都放在一行里完成…有没有更好的解决方案可以让我这样做?
getRestaurantList()
返回餐厅连锁店的各个餐厅的名称,那么这似乎有些过度,因为在给定的社区中找到一个连锁店的实例超出了极限,因此更好的模型是在Restaurant
上拥有一个chain
属性,如果您真的关心的话,并且只需让每个Restaurant
实例拥有自己的条目即可。如果不是这样,那么它是什么意思?为了清晰起见,Restaurant
应该改名为RestaurantChain
吗? - Bohemian