将函数作为参数传递给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);
}