Здравствуйте, я новичок, когда дело доходит до Java 8, поэтому, пожалуйста, будьте терпеливы для меня :)

У меня есть метод, который возвращает пользовательский список объектов. Что мне нужно сделать: у меня есть список disabledPaymentTypesStrings - и я не знаю, сколько у него элементов. Как я могу изменить свой код, чтобы не писать все условия, такие как !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(1))? Я хотел бы как-то разместить весь мой список "disabledPaymentTypesStrings" в качестве условия, но я понятия не имею, как это сделать. Пожалуйста, дайте мне несколько советов или советов :)

private List<PaymentType> listOfPaymentTypesForChangePayment(OrderPaymentTypeParameters paymentTypeParameters) {

        List<String> disabledPaymentTypesStrings = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()));

        return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters).stream()
            .filter(paymentType ->
                !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(0)) &&
                !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(1)) &&
                !paymentType.getName().equalsIgnoreCase(disabledPaymentTypesStrings.get(2)))
            .collect(toList());
    }
2
user3235376 20 Авг 2018 в 13:32

3 ответа

Лучший ответ

Потоковый подход может заключаться в filter() для потоковой передачи списка строк и сохранения элементов PaymentType, где paymentType.getName() не совпадают ни с какими элементами списка строк:

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
        .stream()
        .filter(paymentType -> disabledPaymentTypesStrings.stream()
               .allMatch(ref -> !ref.equalsIgnoreCase(paymentType.getName())))
        .collect(toList());

Но вы также можете сравнить String с использованием того же случая. Например строчные. Это упростит фильтрацию.

Вы можете преобразовать элементы списка ссылок в нижний регистр:

List<String> disabledPaymentTypesStrings = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()))
 .stream()
 .map(String::toLowerCase)
 .collect(toList());

И вы можете использовать List.contains() в filter():

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
    .stream()
    .filter(paymentType -> !disabledPaymentTypesStrings.contains(paymentType.getName().toLowerCase()))
    .collect(toList());

Обратите внимание, что для больших списков использование Set будет более эффективным.

3
davidxxx 20 Авг 2018 в 10:56

Оба шага должны иметь значения в общем случае (в верхнем или нижнем регистре, я предпочел нижний регистр)

List<String> disabledPaymentTypesStringsLowerCase = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()))
 .stream()
 .map(String::toLowerCase)
 .collect(toList());

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
    .stream()
    .map(paymentType -> paymentType.getName())
    .map(String::toLowerCase)
    .filter(disabledPaymentTypesStrings::contains)
    .collect(toList());

Этот код может быть дополнительно реорганизован, если известен класс paymentType, предполагая, что класс paymentType равен PaymentType , и будет выглядеть следующим образом:

return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters)
    .stream()
    .map(PaymentType::getName)
    .map(String::toLowerCase)
    .filter(disabledPaymentTypesStrings::contains)
    .collect(toList());
0
wosimosi 20 Авг 2018 в 11:08

Используйте contains(). Но вы должны думать о игнорировании чувствительности к регистру

private List<PaymentType> listOfPaymentTypesForChangePayment(OrderPaymentTypeParameters paymentTypeParameters) {

            List<String> disabledPaymentTypesStrings = newArrayList(Splitter.on(COMMA).split(systemUtils.getChangePaymentTypeDisabled()));

            return paymentTypeSelector.availablePaymentTypesForChangePayment(paymentTypeParameters).stream()
                .filter(paymentType -> !disabledPaymentTypesStrings.contains(paymentType)
                .collect(toList());
        }
0
Vadzim Dvorak 20 Авг 2018 в 10:40
51928849