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

标签 java lambda java-8 java-stream

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





How do I define a method which takes a lambda as a parameter in Java 8?

(16 个回答)



How to pass a Java 8 lambda with a single parameter

(3 个回答)



How to pass a function as a parameter in Java? [duplicate]

(8 个回答)



Java 8 pass method as parameter

(2 个回答)


11 个月前关闭。




我有以下方法:

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(","));
}
...这基本上是代码重复。有没有办法可以将函数作为方法参数传递来优化它,以便对两种过滤条件都有一种方法?

最佳答案

您可以通过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);

关于java - 将函数作为参数传递给 Lambda java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65630273/

相关文章:

java - 编译 Java 8 中的一个奇怪的 NullPointerException(编译器(1.8.0_31))

java - 为什么 Java 中的局部变量不被视为 "effectively final",即使之后没有任何修改?

java - Libgdx FileHandle readString() 不起作用

java - 测试 java.time API

c++ - 怎么可能写 f( *this, std::forward<Args>(args)... ) 而 f 只用 F f 声明;

java - 在 Java 8 中反转比较器

java - GSON 未将新字段保存到文件中

java - 如何建模两个聚合根之间的关系

python - python lambda 函数在 class 和 def 中的区别

c++ - 在 C++ 中优雅地移植 lambda 表达式