Поиск и добавление элементов из Map в List(Stream API java8)

351
03 января 2018, 19:13

У меня есть Map<String, Item>, где Item - это сущности, которые мне нужно собрать в отдельный List<Item>. Собрать нужные Item я пытаюсь в методе formOrders:

public class InvoiceData {
static final Vendor vendor = Vendor.getInstance();
private List<Invoice> orders;
private List<Customer> customers;
private Map<String, Item> items;
public List<Invoice> getOrders() {
    return orders;
}
public InvoiceData() {
    orders = formOrders();
}
//...сustomerSupplier, itemSupplier...
public List<Invoice> formOrders() {
    List<Invoice> result = new ArrayList<>();  //лист заказов, сюда собственно будут собираться объекты Invoice
    customers = customerSupplier.get(); //покупатели
    items = itemSupplier.get(); //товары
    customers.forEach(customer -> {
        Invoice invoice = new Invoice();
        result.add(invoice);
        invoice.setVendor(vendor);
        invoice.setRecipient(customer);
        invoice.setTax(0.2);
        invoice.setItems(items.entrySet().stream()
                .filter(item -> item.getKey().equals(customer.getId()))
                .map(Map.Entry::getValue)
                .collect(Collectors.toList()));
    });
    return result;
}}

Сам список заказов orders состоит из объектов класса Invoice

public class Invoice {
private Vendor vendor;
private Customer recipient;
private List<Item> items;
private BigDecimal priceOverall;
private Double tax;
public Invoice() {
}
// ...get и set...

В классе InvoiceData происходит "наполнение" данными. В дальнейшем объект этого класса будет использован для генерации отчетов(dynamicreports). customerSupplier и itemSupplier предоставляют константный набор элементов для инициализации cписков customers и items соответственно.

Проще говоря: я беру определенного покупателя(Customer) и нахожу все товары, которые он заказал(хранятся в Map). Поскольку знакомство с java Stream API я начал недавно, я не совсем понимаю как собрать элементы из Map в List с помощью Stream. Нужно ли писать собственный Collector или есть более простое решение? Буду рад любой помощи.

Answer 1

Если просто взять из мапы какие-то ключи (например, отфильтрованные по какому-то предикату), а значения собрать в листе, то что-то типа такого:

itemSupplier.get().entrySet().stream()
        .filter(entry -> entry.getKey().equals(customer.getId()))
        .map(Map.Entry::getValue)
        .collect(Collectors.toList())
);

Но непонятно что вы хотите дальше делать с инвойсом и зачем создавался лист orders...

READ ALSO
Обращение одного jFrame к элиментам другого jFrame

Обращение одного jFrame к элиментам другого jFrame

Здравствуйте, есть ли возможность обращаться с одного jFrame к элементам другого jFrame?

238
Загрузка фото VK API. Java

Загрузка фото VK API. Java

Работаю в Android StudioС помощью моей программы можно опубликовать пост в сообществе ВК

305
Как заполнить двумерный массив в Java

Как заполнить двумерный массив в Java

C Новым Годом) никак не могу понять как заполнить двумерный массив цифрами от 1 до 8 размерностью 8 на 8Кроме как заполнить его вручную

385
Очень короткий код на Java: [требует правки]

Очень короткий код на Java: [требует правки]

Здравствуйте, прошу Вас о помощи Очень короткий код на Java:

372