gpt4 book ai didi

java - 使用流 Java 8 从 List,List 转换为 List
转载 作者:行者123 更新时间:2023-11-30 01:47:55 32 4
gpt4 key购买 nike

我有 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>新类(class)的。你能帮忙吗?

编辑1:OrderPredicate.orderDiffSize 是一个简单的函数,用于比较当前和之前订单的用户、交易日期、数量和符号(+ 表示卖出,- 表示买入)。为简洁起见,此处未提供。

编辑2:上一个/当前列表的大小是合理的,可以忽略 o log n 计算问题。

编辑3:删除了方向以保持简单。例如,我分别在 7 月 1 日、7 月 2 日和 7 月 3 日有 prevOrders 和 CurrentOrders 订单。如果同一日期的订单数量不同,我想将其放入 DiffOrders 中,其中包含当前和之前的数量。希望这能让大家清楚。

最佳答案

听起来这个问题的症结在于您想要忽略 current 中与 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());

关于java - 使用流 Java 8 从 List<Object>,List<Object> 转换为 List<AnotherObject>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57254318/

32 4 0