java - 为什么这个函数允许我使用 lambda 表达式

标签 java generics lambda

为什么这个采用接口(interface)作为参数的函数允许我编写 lambda 表达式?

获取这个函数:

public ConditionBuilder<T> and(Condition<T> condition1) {
        conditional.getConditions().add(condition1);
        return this;
    }

情况如下:

public interface Condition<T> {
    boolean evaluate(T t);


    default boolean evaluateClause(T t, Condition<T> left, Condition<T> right, Operator operator) {
        switch (operator) {
            case AND:
                return left.evaluate(t) && right.evaluate(t);
            case OR:
                return left.evaluate(t) || right.evaluate(t);
            default:
                return false;
        }
    }


    default boolean evaluateStatement(T t, Collection<Condition<T>> conditions) {
        for (Condition condition : conditions) {
            if (!condition.evaluate(t)) return false;
        }
        return true;
    }
}

我不知道为什么我可以为这个接口(interface)编写 lambda 表达式。我想我必须传递一些实现该接口(interface)的东西,而不是让我编写一个 lambda。

例如

return Conditional.<User>start(user -> isUserNameUnique(user.getUserName()))
            .and(user -> user.getFirstName() != null && user.getLastName() != null)
            .and(user -> !user.getFirstName().isEmpty() && !user.getLastName().isEmpty())
            .or(user -> isEmailUnique(user.getEmail()))
            .build();

最佳答案

要使用 lambda 表达式,您所需要做的就是创建一个带有 SAM(单一抽象方法)的接口(interface)。之后,您可以使用给定接口(interface)对方法进行参数化,这意味着每次调用具有行为参数化的方法时,您都会传入一个满足 SAM 的函数描述符的函数界面内以及函数将执行的逻辑。这实际上是 SAM实现

使用 @FunctionalInterface 注释也是一个好习惯。这用于指示接口(interface)类型声明旨在成为函数式接口(interface)。这样做的优点是编译器检查接口(interface)是否只有 SAM

关于java - 为什么这个函数允许我使用 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124329/

相关文章:

java - 对于 JSP,taglib URI 是否意味着我的站点依赖于 URI 解析?

swift - 如何将 nil 作为可选泛型函数参数传递

java - 一遍又一遍地使用相同的 Hibernate Session 是一种好习惯吗

Java 泛型 : Casting a raw type to any reifiable type doesn't generate unchecked cast warning

generics - 当我在 Haskell 中编写 "show"和 "read"时发生了什么?

vb.net - 'ByRef' 参数 '<parametername>' 不能在 lambda 表达式中使用

c++ - 如何访问可变 lambda 函数参数

python - 如果在 jupyter notebook 中使用 python 或 pandas,如何将列中的逗号分隔字符串拆分为不同的列

java - 将参数传递给 log4j 文件

Java 8 lambda 和抽象类接口(interface)的扩展