Получить значения из объекта с помощью оператора map () и применить предикат - PullRequest
0 голосов
/ 07 января 2019

Пожалуйста, потерпите меня из-за глупого вопроса, я новичок в Java8. Я должен написать следующий код, используя лямбду и применить условие к двум атрибутам. Я могу получить один и применить к нему предикат.

for (EventTypePricingMapping eventTypePricingMapping : eventTypePricingMappings) {
        BigDecimal feePerRevenue = eventTypePricingMapping.getFeePerRevenue();
        if (feePerRevenue != null && feePerRevenue.intValue() < 0) {
            throw ExceptionHelper.badRequest("Fee Per Transaction can't be less than zero");
        }
        if (eventTypePricingMapping.getFeePerReg().intValue() < 0) {
            throw ExceptionHelper.badRequest("Fee Per Transaction can't be less than zero");
        }
    }

В приведенном ниже коде, как я могу получить значение feePerRevenue и применить к нему предикат, как я это сделал для getfeePerReg в приведенном ниже коде.

boolean isRegFeeInvalid = globalPricingRequests.stream()
                .map(GlobalPricingRequest::getEventTypePricingList)
                .flatMap(List::stream)
                .map(EventTypePricingMapping::getFeePerReg)
                .anyMatch(criteria);

Мой предикат выглядит примерно так:

Predicate<BigDecimal> criteria = value -> value != null && value.signum() < 0;

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

boolean isRegFeeInvalid = globalPricingRequests.stream()
                .map(GlobalPricingRequest::getEventTypePricingList)
                .flatMap(List::stream)
                .map(EventTypePricingMapping::getFeePerReg,EventTypePricingMapping::getFeePerReg)
                .anyMatch(verifyFeePerRegAndFeePerRevenue());




private static boolean verifyFeePerRegAndFeePerRevenue(BigDecimal feePerReg, BigDecimal feePerRevenue) {
        Predicate<BigDecimal> criteria = value -> value != null && value.signum() < 0;
        return criteria.test(feePerReg) && criteria.test(feePerRevenue);
    }

Как получить два значения в строке map(EventTypePricingMapping::getFeePerReg,EventTypePricingMapping::getFeePerReg) и передать их в операторе anyMatch

1 Ответ

0 голосов
/ 07 января 2019

карта

<R> Stream<R> map(Function<? super T,? extends R> mapper)

Возвращает поток, состоящий из результатов применения данной функции к элементам этого потока.

Это промежуточная операция.

Поэтому я предлагаю создать два разных List, один для feePerReg, а другой для feePerRevenue

feePerReg

List<BigDecimal> feeperReg =  globalPricingRequests.stream().flatMap(eventPrice->eventPrice.getEventTypePricingList().stream()).map(eventType->eventType.getFeePerReg()).collect(Collectors.toList());

feePerRevenue

List<BigDecimal> feePerRevenue = globalPricingRequests.stream().flatMap(eventPrice->eventPrice.getEventTypePricingList().stream()).map(eventType->eventType.getFeePerRevenue()).collect(Collectors.toList());

Предикат Предикат для проверки обоих списков

Predicate<BigDecimal> criteria = value -> value != null && value.signum() < 0;

verifyFeePerRegAndFeePerRevenue метод, который принимает два List<BigDecimal> в качестве аргумента

private static boolean verifyFeePerRegAndFeePerRevenue(List<BigDecimal> feePerReg, List<BigDecimal> feePerRevenue) {
    Predicate<BigDecimal> criteria = value -> value != null && value.signum() < 0;
    return feePerReg.stream().anyMatch(criteria) && feePerRevenue.stream().anyMatch(criteria);
}

Дело 2

Вместо двух разных List вы можете иметь только один список с условиями eventTypePricingMapping и Predicate для feePerReg и feePerRevenue

eventTypePricingMapping

List<EventTypePricingMapping> result = globalPricingRequests.stream().flatMap(eventPrice->eventPrice.getEventTypePricingList().stream()).collect(Collectors.toList());

Предикат Предикат для проверки обоих

Predicate<EventTypePricingMapping> criteria = value -> value.getFeePerRevenue() != null && value.getFeePerReg()!= null && value.getFeePerRevenue() < 0 && value.getFeePerReg < 0;

verifyFeePerRegAndFeePerRevenue метод занимает List<EventTypePricingMapping> применять Predicate в списке

private static boolean verifyFeePerRegAndFeePerRevenue(List<EventTypePricingMapping> price) {
    Predicate<EventTypePricingMapping> criteria = value -> value.getFeePerRevenue() != null && value.getFeePerReg()!= null && value.getFeePerRevenue() < 0 && value.getFeePerReg < 0;
    return price.stream().anyMatch(criteria);
}
...