java-8 带参数谓词

标签 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如下文字:

It is not possible to specify a particular signature to be matched, for example, Arrays::sort(int[]). Instead, the functional interface provides argument types that are used as input to the overload resolution algorithm (§15.12.2). This should satisfy the vast majority of use cases; when the rare need arises for more precise control, a lambda expression can be used.

最佳答案

方法引用无法捕获其他变量。

你能做的是

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());

关于java-8 带参数谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40653292/

相关文章:

java - 在处理不可变对象(immutable对象)时,如何最好地返回带有修改字段的副本?

java - 如果存在特定键 Java 8 的值,则检查列表映射

java - 使用 Spring JPA 规范和 Hibernate 加入不同的元素

c# - 如何将附加参数传递给谓词函数?

R 检查 TRUE/FALSE 值列表的计算结果是否为 TRUE

java - 当你调用 new Object() 时会发生什么?

java - tiles未找到jsp文件,如何正确包含jsp文件

java - 复制 Java keystore

java - 使用导航栏后要返回熄灯模式吗?

java - 使用 Java Comparator 自定义排序 - 保留具有特定值的对象的位置