对于实际中的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中实现了如下内容:
不可能指定要匹配的特定签名,例如数组:排序(int[])。相反,函数接口提供作为过载解析算法输入的参数类型(§15.12.2)。这应该满足绝大多数用例;当出现对更精确控制的罕见需求时,可以使用lambda表达式。
发布于 2016-11-17 11:12:15
方法引用无法捕获其他变量。
你能做的就是
List<Apple> colorApples = filterApples(inventory, a -> isAppleOfColor(a, "red"));你会注意到它更短。
注意:我将避免使用static方法,尤其是当第一个参数是您正在编写的类型时。加起来好得多
// 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());https://stackoverflow.com/questions/40653292
复制相似问题