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

使用流 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 关注
  • 118 浏览

添加回答

举报

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