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

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

使用流 Java 8 從 List<Object>,List<Object> 轉換為 List

使用流 Java 8 從 List<Object>,List<Object> 轉換為 List

慕尼黑8549860 2023-04-26 16:20:10
我有 2 個相同類型的列表說class Orders {    Strig User;    String tradeDate;    BigDecimal Qty;}比較后,我想轉換為另一個對象的列表說class DiffOrders {        String User;        String tradeDate;        BigDecimal currentQty;        BigDecimal prevQty;    }我有兩個訂單列表List<Orders>currentOrders;List<Orders>prevOrders;   List<Orders> DiffOrders = current.stream()                                       .filter(curr->previous.stream().anyMatch(prev->OrderPredicate.orderDiffSize(curr, prev)))                                       .collect(Collectors.toList());對于同一日期和同一用戶的訂單,我想捕獲匹配訂單中的數量。我能夠找到List<Orders>匹配的。但不確定如何捕獲并轉換為List<DiffOrders>新類的。能否請你幫忙?編輯 1:OrderPredicate.orderDiffSize 是一個簡單的函數,用于比較當前和先前訂單的用戶、交易日期、數量和符號(+ 代表賣出,- 代表買入)。為簡潔起見,此處未提供。編輯 2:上一個/當前列表的大小是合理的,可以忽略 o log n 計算問題。編輯 3:刪除方向以保持簡單。例如,我分別在 01-Jul、02-Jul、03-Jul 的 prevOrders 和 CurrentOrders 中有訂單。如果同一日期的訂單數量不同,我想將其放入 DiffOrders 中,其中包含當前和之前的數量。希望這能說明問題。
查看完整描述

3 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

聽起來這個問題的癥結在于您想要省略 中current沒有匹配項的任何項目previous,但使用 中的實際對應值轉換確實有匹配項previous的項目。在那種情況下flatMap就是你想要的。您可以使用flatMap將每個Order不轉換為DiffOrders,而是轉換為一個流,DiffOrders對于不匹配項,該流將是空的,并且由單個元素組成,用于匹配項。


List<DiffOrders> matchedOrders = current.stream()

    .flatMap(curr -> {

      Optional<Order> p = previous.stream()

          .filter(prev -> OrderPredicate.orderSameDirectionAndSize(curr, prev))

          .findFirst();

      if (p.isPresent() && !p.get().qty.equals(curr.qty)) {

        return Stream.of(new DiffOrders(curr.user, curr.tradeDate, curr.qty, p.get().qty));

      } else {

        return Stream.empty();

      }

    }) 

    .collect(Collectors.toList());


查看完整回答
反對 回復 2023-04-26
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

據我了解,這個問題的主要需求之一是 current 和 previous 的映射Order,這樣您就可以MatchOrder從細節中構建出來。當然,這將需要在構建此類當前項到先前項的過程map中進行操作。filter


List<MatchOrders> matchedOrders = currentOrders.stream()

        .map(curr -> new AbstractMap.SimpleEntry<>(curr, prevOrders.stream()

                .filter(prev -> orderSameDirectionAndSize(curr, prev))

                .findAny())) // <Order, Optional<Order>> currentToOptionalPrevious

        .map(e -> {

            Orders current = e.getKey();

            Orders previous = e.getValue().orElse(current); // assumed a fallback

            return new MatchOrders(current.getUser(), current.getQty(),

                    previous.getQty(), current.getDirection(), previous.getDirection());

        })

        .collect(Collectors.toList());


查看完整回答
反對 回復 2023-04-26
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

對于簡單的代碼和簡單的算法分兩步就可以解決;


private List<DiffOrders>  mergeLists(List<Orders> currentOrders, List<Orders> prevOrders) {

    Map<String, List<Orders>> map = prevOrders.stream().collect(Collectors.groupingBy(order -> order.getUser() + order.getTradeDate()));

    return currentOrders.stream().filter(current ->{

       String key = current.getUser() + current.getTradeDate();

       return map.get(key) != null && !map.get(key).isEmpty();

   }).map(current -> mapper(current, map.get(current.getUser() + current.getTradeDate()))).collect(Collectors.toList());

}


private DiffOrders mapper(Orders current, List<Orders> list) {

    DiffOrders diffOrders = new DiffOrders();

    diffOrders.setCurrentQty(current.getQty());

    diffOrders.setTradeDate(current.getTradeDate());

    diffOrders.setUser(current.getUser());

    diffOrders.setPrevQty(list.get(0).getQty());

    return diffOrders;

}


查看完整回答
反對 回復 2023-04-26
  • 3 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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