Проблема с ArrayList и Stream ... Я должен поток ArrayList с элементами, которые имеют атрибуты в другом ArrayList - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть списки и ... Теперь я должен передать список заказов с продуктами, их названиями и номерами. Я напишу упрощенный код, потому что фактический код довольно длинный

ArrayList<Order> order = new ArrayList<>();
order.add(new Order(011, 579, 1 , true);

ArrayList<Product> prod = new ArrayList<>();
prod.add(new Product(9918, "Nvidia Graphic Card", 1299);

цель состоит в том, чтобы направить ордер с истинным логическим значением (что в данном случае означает подтверждение), а также с именем и номером продукты в этих заказах ....

order.stream().filter(e-> e.isConfirmed()).forEach((v) -> System.out.println("\n \t "+ v));

но это всего лишь заказ, я не знаю, как получить продукт в том же потоке ... Спасибо

1 Ответ

1 голос
/ 17 февраля 2020

Вот один из способов сделать это, но имейте в виду, что это ужасное неэффективное решение, так как для каждого подтвержденного заказа он должен сканировать список продуктов, чтобы найти действительный продукт. Поэтому я настоятельно рекомендую вам рассмотреть возможность использования другой структуры данных (например, 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

Живая демоверсия

...