我有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:删除方向以保持简单。例如,我分别在7月1日,7月2日,7月3日的prevOrders和CurrentOrders中拥有订单。如果同一天的订单数量不同,我想将其放入DiffOrders中,数量与当前和之前的数量相同。希望这一点可以弄清楚。
听起来这个问题的症结在于,您要忽略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());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句