Вот один из способов сделать это, но имейте в виду, что это ужасное неэффективное решение, так как для каждого подтвержденного заказа он должен сканировать список продуктов, чтобы найти действительный продукт. Поэтому я настоятельно рекомендую вам рассмотреть возможность использования другой структуры данных (например, Map<Integer, Product>
, которая уменьшает сложность поиска продукта с O (n) до O (log n) ) для хранения продукты или измените класс Order
для хранения Product
(или даже List<Product>
) напрямую вместо хранения productId
.
public static void main(String[] args) {
List<Order> orders = new ArrayList<>(List.of(
new Order(1, 1, 5, false),
new Order(2, 2, 5, true),
new Order(3, 3, 7, true),
new Order(4, 1, 1, true),
new Order(5, 2, 3, true),
new Order(6, 3, 5, false)
));
List<Product> products = new ArrayList<>(List.of(
new Product(1, "Product 1", 1.99),
new Product(2, "Product 2", 2.99),
new Product(3, "Product 3", 3.99)
));
String confirmedOrders = orders.stream()
.filter(Order::isConfirmed)
.map(order -> products.stream()
.filter(product -> product.getId() == order.getProductId())
.findFirst()
.map(getOrderSummaryString(order))
.orElseThrow(() -> new IllegalArgumentException(
"Invalid product id (#" + order.getProductId() + ") in order #" + order.getId()))
)
.collect(Collectors.joining(System.lineSeparator()));
System.out.println("Confirmed orders list:" + System.lineSeparator() + confirmedOrders);
}
private static Function<Product, String> getOrderSummaryString(Order order) {
return product ->
"\t Order #" + order.getId() + " of " + order.getQuantity() + " * " + product.getName() +
" ($" + product.getPrice() + ")," + " $" +
String.format("%.2f", product.getPrice() * order.getQuantity());
}
Вывод:
Confirmed orders list:
Order #2 of 5 * Product 2 ($2.99), $14.95
Order #3 of 7 * Product 3 ($3.99), $27.93
Order #4 of 1 * Product 1 ($1.99), $1.99
Order #5 of 3 * Product 2 ($2.99), $8.97
Живая демоверсия