Java Карта со значением списка, фильтр в другом списке - PullRequest
0 голосов
/ 15 апреля 2020

Я смотрел на другие темы, но я не могу найти решения для моей проблемы. У меня есть карта, которая содержит ключ = cartID, например, C01 и ArrayList продуктов. Я хочу отфильтровать эту карту в другом ArrayList, который содержит идентификаторы productID, чтобы я мог найти все корзины, содержащие эти продукты. У меня есть следующий код

Map<String, List<OrderLineDTO>> allCarts //contains data these are fetched
List<String> cart; //also contains fetched data for example ["Product01", "Product02"]

allCarts.values().stream().filter(list -> list.stream().allMatch(value -> cart.contains(value.getProductId()))).collect(Collectors.toList()); //filter I'm using but not working

Есть идеи? Спасибо!

Ответы [ 4 ]

0 голосов
/ 16 апреля 2020

Я должен был использовать containsAll, чтобы найти мой ответ. Спасибо всем за помощь!

List<String> carts = allCarts.entrySet().stream()
                    .filter(e -> (e.getValue().stream().map(f -> f.getProductId()).collect(Collectors.toList()).containsAll(cart)))
                    .map(e -> e.getKey()).collect(Collectors.toList());
0 голосов
/ 15 апреля 2020

Далее возвращается список всех тележек в списке, которые содержат указанные идентификаторы продукта. Включен класс OrderLineDTO для выполнения демонстрации.

        Map<String, List<OrderLineDTO>> allCarts = new HashMap<>();
        List<String> cart = new ArrayList<>(); // also contains fetched data for example ["Product01", "Product02"]
        cart.add("ID7");
        cart.add("ID1");
        allCarts.put("cart1", List.of(new OrderLineDTO("ID1"),
                new OrderLineDTO("ID2")));
        allCarts.put("cart2", List.of(new OrderLineDTO("ID3"),
                new OrderLineDTO("ID5")));
        allCarts.put("cart3", List.of(new OrderLineDTO("ID3"),
                new OrderLineDTO("ID4")));
        allCarts.put("cart4", List.of(new OrderLineDTO("ID6"),
                new OrderLineDTO("ID7")));

        List<String> carts = allCarts.entrySet().stream()
                .filter(e -> e.getValue().stream().anyMatch(
                        prod -> cart.contains(prod.getProductId())))
                .map(e -> e.getKey()).collect(Collectors.toList());

        System.out.println(carts);


Отпечатки

[cart1, cart4]
class OrderLineDTO {
    String id;

    public OrderLineDTO(String id) {
        this.id = id;
    }

    public String getProductId() {
        return id;
    }

    public String toString() {
        return id;
    }
}

}

0 голосов
/ 15 апреля 2020

Попробуйте использовать entrySet () и anyMatch:

        allCarts.entrySet().stream().filter(p -> cart.stream().anyMatch(prod -> p.getValue().contains(prod.get))).collect(Collectors.toList());
0 голосов
/ 15 апреля 2020

Если вы хотите найти идентификаторы тележек, содержащих продукты только в списке, это должно работать:

List<String> cartIds = allCarts
    .entrySet().stream()
    .filter(e -> 
        e.getValue().stream().allMatch(p -> productIds.contains(p.getProductId())))
    .map(e -> e.getKey())
    .collect(Collectors.toList());

Так что единственное отличие состоит в том, что я использовал entrySet() вместо из values().

Чтобы найти тележки, содержащие хотя бы один товар в списке, необходимо использовать предикат .anyMatch.

...