亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用來自 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條經驗 獲得超8個贊

這就是 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 關注
  • 83 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號