java-8用参数预测

时间:2016-11-17 11:07:43

标签: java java-8 predicate

对于动作示例中的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) {

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

public static boolean isAppleOfColor(Apple apple, String color)

我想使用相同的模式::

访问它
 List<Apple> colorApples = filterApples(inventory, FilteringApples::isAppleOfColor("red"));

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

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

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

然后调用

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

这很有效。但有没有办法可以使用“引用”参数化方法,如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)。这应该满足绝大多数   用例;当需要更精确的控制时,a   可以使用lambda表达式。

1 个答案:

答案 0 :(得分:4)

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

你能做的是

List<Apple> colorApples = filterApples(inventory, a -> isAppleOfColor(a, "red"));

你会注意到它更短。

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

// added to Apple
public boolean isColor(String color)

你可以致电

List<Apple> colorApples = filterApples(inventory, a -> a.isColor("red"));

可能与

相同
List<Apple> colorApples = inventory.stream()
                                   .filter(a -> a.isColor("red"))
                                   .collect(toList());