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());

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());

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;
}
添加回答
舉報