Java Потоковая обработка с проверкой состояния потока if / - PullRequest
0 голосов
/ 02 апреля 2020

Дано: список клиентов (с полями «Поставщик» и «Агентство»), Строковое агентство, Поставщик строки.

Цель: проверить, поддерживает ли какой-либо клиент данное агентство И данного поставщика.

У меня есть поток, который должен быть отфильтрован дважды (по двум значениям). Если после первой фильтрации поток пуст, мне нужно проверить его и выдать исключение. Если он не пустой, мне нужно обработать его через второй фильтр (а затем еще раз проверить, если он не пустой).

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

В настоящее время мой код выглядит следующим образом:

void checkAgencySupplierMapping(String agency, String supplier) {
   List<Customers> customersFilteredByAgency = allCustomers.stream()
             .filter(customer -> customer.getAgency().equals(agency))
             .collect(toList());

   if (customersFilteredByAgency.isEmpty()) throw new AgencyNotSupportedException(agency);

   customersFilteredByAgency.stream()
             .filter(customer -> customer.getSupplier().equals(supplier))
             .findFirst().orElseThrow(() -> throw new SupplierNotSupportedException(supplier);
}

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

И я хочу добиться чего-то подобного:

void checkAgencySupplierMapping(String agency, String supplier) {
    allCustomers.stream()
       .filter(customer -> customer.getAgency().equals(agency))
       .ifEmpty( () -> throw new AgencyNotSupportedException(agency) )
       .filter( customer -> customer.getSupplier().equals(supplier)
       .ifEmpty( () -> throw new SupplierNotSupportedException(supplier); // or findFirst().orElseThrow...
}

Есть ли какая-либо функция Java 8, которая позволит мне проверять состояние моего потока, не прерывая его?

1 Ответ

3 голосов
/ 02 апреля 2020

Приведенный ниже код немного уродлив, но работает так, как вы wi sh.

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

AtomicInteger countAgencyMatches = new AtomicInteger(0);

allCustomers.stream()
        .filter(customer -> {
            if (customer.getAgency().equals(agency)) {
                countAgencyMatches.incrementAndGet();
                return true;
            }

            return false;
        })
        .filter(customer -> customer.getSupplier().equals(supplier))
        .findFirst()
        .orElseThrow(() -> {
            if (countAgencyMatches.get() == 0) {
                return new AgencyNotSupportedException(agency);
            }

            return new SupplierNotSupportedException(supplier);
        });
...