我需要定义地图,其中键是一天,值是帖子列表。在RequestMapping中,我给出/{year}/{month}/{day}
,但是day是可选的。如何定义map并将其返回给json以获取JSON,其中JSON的日期为1月31日,直到我拥有当天创建的对象的列表。我的控制器代码:
@RequestMapping(value = "/post/{year}/{month}/{day}", method = RequestMethod.GET)
public List<Post> getPostsByDate(@PathVariable("year") int year,
@PathVariable("month") int month,
@PathVariable("day") Optional<Integer> day)
{
if (day.isPresent()){
return postRepository.findAllByCreateDate(year, month, day);
} else return postRepository.findAllByMonthAndYear(year, month);
List<Post> posts = postRepository.findAllByMonthAndYear(year, month);
Map<Date, List<Post>> postMap =
}
并发布存储库代码:
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findAllByUser(User user);
@Query("select p from Post p where (year(p.createDate) = ?1 and month(p.createDate) = ?2) order by p.createDate")
List<Post> findAllByMonthAndYear(int year, int month);
@Query("select p from Post p where (year(p.createDate) = ?1 and month(p.createDate) = ?2 and day(p.createDate) = ?3) order by p.createDate")
List<Post> findAllByCreateDate(int year, int month, Optional<Integer> day);
}
答案 0 :(得分:2)
逻辑就是这样, 检查地图中是否存在日期(密钥)。
1)如果是,则检索当天的帖子列表并将新帖子添加到列表中
2)其他为地图中的日期添加新条目
if (day.isPresent()){
return postRepository.findAllByCreateDate(year, month, day);
} else return postRepository.findAllByMonthAndYear(year, month);
List<Post> posts = postRepository.findAllByMonthAndYear(year, month);
Map<Date, List<Post>> postMap = new HashMap();
if(postMap.contains()){
//Add record to list for day key
postMap.put(day,postMap.get(day).add(postObject) );
}else{
//Add new entry for day
List<Post> posts = new ArrayList();
posts.add(postObject);
postMap.put(day,postMap.get(day).add(posts) );
}
答案 1 :(得分:1)
使用Java 8可以以更短的形式实现类似。
postMap.computeIfAbsent(day, k -> Collections.emptyList()).add(postObject);
另外一种方法是POST类的getDay方法或其他获取日期的方法:
Map<Date, List<Post>> postMap = posts.stream().collect(Collectors.groupingBy(Post::getDay));
两种方法都可以正常工作。第二个更加精确和声明性。