java-8带有参数的谓词

Opt*_*nal 2 java predicate java-8

对于实际使用的Java8示例:: https://github.com/java8/Java8InAction/blob/master/src/main/java/lambdasinaction/chap1/FilteringApples.java

 public static boolean isGreenApple(Apple apple), 
 public static boolean isHeavyApple(Apple apple) {
Run Code Online (Sandbox Code Playgroud)

我想添加类似的方法,例如

public static boolean isAppleOfColor(Apple apple, String color)
Run Code Online (Sandbox Code Playgroud)

我想使用相同的模式访问它:

 List<Apple> colorApples = filterApples(inventory, FilteringApples::isAppleOfColor("red"));
Run Code Online (Sandbox Code Playgroud)

但是我不能在FilteringApples :: isAppleOfColor(“ red”)中传递参数。

到目前为止,我已经使用以下方法实现了这一点:

public static Predicate<Apple> colourMatches( String color) {
    return p->color.equals(p.getColor());
}
Run Code Online (Sandbox Code Playgroud)

然后打电话

  List<Apple> colorApples = filterApples(inventory, (Apple a)->a.colourMatchesOnApple("red"));
    System.out.println(colorApples);
Run Code Online (Sandbox Code Playgroud)

这可行。但是有没有办法我可以使用“引用的”参数化方法,例如FilteringApples::isAppleOfColor("red").

谢谢

编辑

谢谢,我刚刚在JLS 15.13中意识到:https : //docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13 如下文本:

无法指定要匹配的特定签名,例如Arrays :: sort(int [])。而是,功能接口提供了用作过载解析算法(第15.12.2节)的输入的参数类型。这应该满足绝大多数用例;当极少数需要进行更精确的控制时,可以使用lambda表达式。

Pet*_*rey 5

方法参考无法捕获其他变量。

你能做的是

List<Apple> colorApples = filterApples(inventory, a -> isAppleOfColor(a, "red"));
Run Code Online (Sandbox Code Playgroud)

您会注意到它较短。

注意:static当第一个参数是您正在编写的类型时,我将避免使用esp方法。更好地添加

// added to Apple
public boolean isColor(String color)
Run Code Online (Sandbox Code Playgroud)

你可以打电话

List<Apple> colorApples = filterApples(inventory, a -> a.isColor("red"));
Run Code Online (Sandbox Code Playgroud)

这可能与

List<Apple> colorApples = inventory.stream()
                                   .filter(a -> a.isColor("red"))
                                   .collect(toList());
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在此特定示例中,仅提供一个常量值作为方法参数,而没有捕获任何变量。这仍然是方法引用不支持的内容,因此需要lambda表达式,但是lambda表达式是* non-captureing *,与捕获lambda相比,它具有性能优势。 (4认同)