为了账号安全,请及时绑定邮箱和手机立即绑定

使用来自 Rest API 的值返回键

使用来自 Rest API 的值返回键

动漫人物 2022-06-15 10:33:12
我想从 Rest API 端点返回 JSON 作为带有值的键。例子:  {    "terminal 1":       {"date":"2018-10-06T00:00:00.000+0000","volume":111,"count":1},    "terminal 2":       {"date":"2018-11-06T00:00:00.000+0000","volume":122,"count":1}  }如何添加密钥?我想应该是这样的:List<String<List<TopTerminalsDTO>>>>你能给我一些代码示例吗?清理最终代码的最新尝试:@GetMapping("/terminals")public ResponseEntity<Map<Integer, List<TopTerminalsDTO>>> getTopTerminalsVolumes(        @RequestParam(value = "start_date", required = true) String start_date,        @RequestParam(value = "end_date", required = true) String end_date) {        LocalDateTime start_datel = LocalDateTime.now(Clock.systemUTC());        LocalDateTime end_datel = LocalDateTime.now(Clock.systemUTC());        final List<PaymentTransactionsDailyFacts> list = dashboardRepository.top_daily_transactions(start_datel, end_datel);        final Collector<PaymentTransactionsDailyFacts, List<TopTerminalsDTO>, List<TopTerminalsDTO>> terminalsCollector =                 Collector.of(                    ArrayList::new,                    (terminals, p) -> terminals.add(mapper.toTopTerminalsDTO(p)),                    (accumulator, terminals) -> {                       accumulator.addAll(terminals);                       return accumulator;                    }                 );        final Map<Integer, List<TopTerminalsDTO>> final_map =                      list.stream()                         .filter(p -> p.getTerminal_id() != null)                         .collect(Collectors.groupingBy(p -> p.getTerminal_id(), terminalsCollector));    return ResponseEntity.ok(final_map);}
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

在您的 JSON 之后,testDate()应该返回Map<String, TopTerminalsDTO>而不是List.


Map<String, TopTerminalsDTO> result = newHashMap();


for (int i = 0; i <= 10; i++) {


    TopTerminalsDTO ttDto = new TopTerminalsDTO();

    ttDto.setCount(ThreadLocalRandom.current().nextInt(20, 500 + 1));


    LocalDate localDate = LocalDate.now().minus(Period.ofDays((new Random().nextInt(365 * 70))));

    Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());


    ttDto.setDate(date);

    ttDto.setVolume(ThreadLocalRandom.current().nextInt(300, 5000 + 1));


    result.put("terminal "+i, ttDto)

}


return result;

当然,将休息方法的响应类型更改为ResponseEntity<Map<String, TopTerminalsDTO>>


查看完整回答
反对 回复 2022-06-15
?
慕仙森

TA贡献1827条经验 获得超7个赞

这就是 Javascript 的dictionary样子。

在 Java 中,正确的表示是Map<String, TopTerminalDto>.


假设您有一个有序列表,并且您想返回一个Map带有生成的键的列表terminal{index}。


final List<TopTerminalDto> list = ...

final Map<String, TopTerminalDto> map = 

         IntStream.range(0, list.size())

                  .boxed()

                  .collect(toMap(i -> "terminal" + i, i -> list.get(i)));

Spring 端点将变为:


@GetMapping("terminals")

Map<String, TopTerminalDto> getTopTerminalVolumes() { ... }

在ResponseEntitySpring 中不是强制性的。


记住尽可能通过Stream(s) 工作,以产生没有中间临时状态的结果。


附加示例:


final List<PaymentTransactionsDailyFacts> list = 

            dashboardRepository.top_daily_transactions(start_datel, end_datel);


final Map<String, TopTerminalDto> map =

            list.stream()

                .collect(toMap(p -> p.getTerminal(), this::toDto))


// Conversion method

private TopTerminalDto toDto(final PaymentTransactionsDailyFacts p) {

    // Implement conversion to Dto

}

对于与终端关联的多个值:


final Map<Integer, List<TopTerminalDto>> map = 

             list.stream()

                 .filter(p -> p.getTerminal() != null)

                 .collect(groupingBy(

                     p -> p.getTerminal(),

                     Collector.of(

                            ArrayList::new,

                            (terminals, p) -> terminals.add(toDto(p)),

                            (accumulator, terminals) -> {

                                accumulator.addAll(terminals);

                                return accumulator;

                            }

                     )

             ));

您可以通过提取收集器来清理代码。


final Collector<Integer, List<TopTerminalDto>, List<TopTerminalDto>> terminalsCollector =

             Collector.of(

                ArrayList::new,

                (terminals, p) -> terminals.add(toDto(p)),

                (accumulator, terminals) -> {

                   accumulator.addAll(terminals);

                   return accumulator;

                }

             )


final Map<Integer, List<TopTerminalDto>> map = 

             list.stream()

                 .filter(p -> p.getTerminal() != null)

                 .collect(groupingBy(p -> p.getTerminal(), terminalsCollector));


查看完整回答
反对 回复 2022-06-15
  • 2 回答
  • 0 关注
  • 57 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信