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

Vin*_*yak 3 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())
            .collect(Collectors.joining(","));
}
Run Code Online (Sandbox Code Playgroud)

我想为 row.isBulkyGood() 重用这个方法。我目前正在做的是

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

...这基本上是代码重复。有没有办法可以将函数作为方法参数传递来优化它,以便对两种过滤条件都有一种方法?

Nik*_*las 5

您可以将Predicate过滤器中使用的正确传递给方法,这是方法中唯一不同的地方。

假设offer.getOfferRows()return 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(","));
}
Run Code Online (Sandbox Code Playgroud)

用法变得相当简单:

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