将函数作为参数传递给lambdajava8

2w3rbyxf  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(492)

这个问题在这里已经有答案了

如何在Java8中定义一个以lambda作为参数的方法(14个答案)
如何用一个参数传递Java8 lambda(3个答案)
如何在java中传递函数作为参数[重复](8个答案)
java 8 pass方法作为参数(2个答案)
昨天关门了。
我有以下方法:

public String getAllDangerousProductsName(Offer offer){
    return offer.getOfferRows().stream()
           .filter(row -> row.isDangerousGood())
            .map(row -> row.getItemInformation().getOfferTexts().getName())
            .collect(Collectors.joining(","));
}

我想对row.isbulkygood()重用此方法。我现在做的是

public String getAllBulkyProductsName(Offer offer){
    return offer.getOfferRows().stream()
            .filter(row -> row.isBulkyGood())
            .map(row -> row.getItemInformation().getOfferTexts().getName())
            .collect(Collectors.joining(","));
}

... 基本上就是代码重复。有没有一种方法,我可以通过作为方法参数的函数来优化这两个过滤条件有一个方法?

wkftcu5l

wkftcu5l1#

你可以通过考试 Predicate 在方法的筛选权限中使用,这是方法中唯一不同的地方。
假设 offer.getOfferRows() 退货 List<OfferRow> ,然后:

public String getAllDangerousProductsName(Offer offer, Predicate<OfferRow> predicate) {
    return offer.getOfferRows().stream()
            .filter(predicate)
            .map(row -> row.getItemInformation().getOfferTexts().getName())
            .collect(Collectors.joining(","));
}

使用变得相当简单:

// using lambda expression
String str1 = getAllDangerousProductsName(offer, row -> row.isDangerousGood());
String str2 = getAllDangerousProductsName(offer, row -> row.isBulkyGood());
// using method reference
String str1 = getAllDangerousProductsName(offer, OfferRow::isDangerousGood);
String str2 = getAllDangerousProductsName(offer, OfferRow::isBulkyGood);
yqkkidmi

yqkkidmi2#

是的,你可以加一个 Predicate<OfferRow> 参数,然后使用方法引用 OfferRow::isDangerousGood 或者 OfferRow::isBulkyGood :

public static String getAllProductsNameByPredicate(Offer offer, Predicate<OfferRow> predicate){
    return offer.getOfferRows().stream()
            .filter(predicate)
            .map(row -> row.getName())
            .collect(Collectors.joining(","));
}

// invoke with different predicates
getAllProductsNameByPredicate(myOffer, OfferRow::isDangerousGood);
getAllProductsNameByPredicate(myOffer, OfferRow::isBulkyGood);

如果需要否定 predicate 的条件, Predicate.not 可以从Java11开始使用。
对于Java8-10,可以使用 Predicate.negate() :

public static <R> Predicate<R> not(Predicate<R> predicate) {
    return predicate.negate();
}

getAllProductsNameByPredicate(myOffer, not(OfferRow::isDangerousGood));
tyu7yeag

tyu7yeag3#

是,创建一个 filterAndJoin :

public String filterAndJoin(Offer offer, Predicate<Row> predicate){
    return offer.getOfferRows().stream()
        .filter(predicate)
        .map(row -> row.getItemInformation().getOfferTexts().getName())
        .collect(Collectors.joining(","));
  }

然后把电话转到

public String getAllDangerousProductsName(Offer offer){
    return filterAndJoin(offer, Row::isBulkyGood);
}

相关问题