使用 map() 运算符从对象中获取值并应用谓词

Fetch values from Object using map() operator and apply predicate

请耐心等待我的愚蠢问题,我是 Java8 的新手。我必须使用 lambda 编写以下代码并将条件应用于两个属性。我能够获取一个并在其上应用谓词。

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 运算符

地图

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

Returns a stream consisting of the results of applying the given function to the elements of this stream.

This is an intermediate operation.

所以我建议创建两个不同的 List,一个用于 feePerReg,另一个用于 feePerRevenue

feePerReg

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

按收入收费

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);
}

案例二

而不是两个不同的 List,您可以只有一个列表同时具有 eventTypePricingMappingPredicate 条件 feePerRegfeePerRevenue

eventTypePricingMapping

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

Predicate 谓词检查两者

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);
}