将函数作为参数传递给Lambda java 8

将函数作为参数传递给Lambda java 8,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有以下方法: public String getAllDangerousProductsName(Offer offer){ return offer.getOfferRows().stream() .filter(row -> row.isDangerousGood()) .map(row -> row.getItemInformation().getOfferTexts().getName()) .c

我有以下方法:

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(","));
}

。。。基本上就是代码重复。是否有一种方法可以将函数作为方法参数传递,以优化此方法,使两个筛选条件都有一个方法?

您可以将筛选中使用的
谓词
传递给方法,这是两种方法中唯一不同的地方

假设
offer.getOfferRows()
返回
List
,则:

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

是,创建一个
过滤器并连接

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

是的,您可以向该方法添加一个
谓词
参数,然后使用方法引用
OfferRow::isDangerousGood
OfferRow::isBulkyGood

公共静态字符串getAllProductsNameByPredicate(提供、提供、谓词谓词){
return offer.getOfferRows().stream()
.filter(谓词)
.map(行->行.getName())
.collect(收集器。连接(“,”);
}
//使用不同的谓词调用
getAllProductsNameByPredicate(myOffer,OfferRow::isDangerousGood);
getAllProductsNameByPredicate(myOffer,OfferRow::isBulkyGood);
如果需要否定谓词的条件,则可以从Java11开始使用

对于Java 8-10,可以使用
谓词.negate()
实现实用程序方法:

公共静态谓词not(谓词谓词){
返回谓词.negate();
}
getAllProductsNameByPredicate(myOffer,not(OfferRow::isDangerusGood));
// using method reference
String str1 = getAllDangerousProductsName(offer, OfferRow::isDangerousGood);
String str2 = getAllDangerousProductsName(offer, OfferRow::isBulkyGood);
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);
}