代码之家  ›  专栏  ›  技术社区  ›  Ishant Gaurav

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

  •  -1
  • Ishant Gaurav  · 技术社区  · 6 年前

    请容忍我这个愚蠢的问题,我刚接触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;
    

    我根据建议尝试了下面的代码,但无法在

    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) 在任何匹配运算符中传递它们

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ryuzaki L    6 年前

    地图

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

    返回由将给定函数应用于此流元素的结果组成的流。

    这是一个中间操作。

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

    菲珀雷格

    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;
    

    验证feeperregandfeeperrevenue 方法需要两个 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

    而不是两个不同的 ,您只能有一个列表 eventTypePricingMapping Predicate 两者都有条件 菲珀雷格 财政收入

    事件类型PricingMapping

    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;
    

    验证feeperregandfeeperrevenue 方法采取 List<EventTypePricingMapping> 应用 谓语 在名单上

    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);
    }
    
    推荐文章