gpt4 book ai didi

java - java 如何知道 lambda 参数的类型?

转载 作者:行者123 更新时间:2023-12-02 09:10:59 25 4
gpt4 key购买 nike

在这样的示例代码中,我的 IDE 将代码从使用匿名类更改为返回 lambda。这很酷,但是它是如何工作的呢?

public static Specification<User> getUsersByFirstNameSpec(String name) {
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root,
CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
Predicate equalPredicate = criteriaBuilder.like(
criteriaBuilder.upper(root.get("firstName")),
name.toUpperCase());
return equalPredicate;
}
};
}

java如何知道这3个参数的类型?

 public static Specification<User> getUsersByLastNameSpec(String name) {
return (Specification<User>) (root, query, criteriaBuilder) -> {
Predicate equalPredicate = criteriaBuilder.like(
criteriaBuilder.upper(root.get("lastName")),
name.toUpperCase());
return equalPredicate;
};
}

最佳答案

在 java 中,lambda 被解释为所谓的“函数式接口(interface)”。

函数式接口(interface)是包含 1 个“非对象、非默认”方法的任何接口(interface)(如 public interface SomeInterface { ... } )。因此,对于接口(interface)中声明的每个方法,如果它只是重​​复 java.lang.Object 规范中已有的内容,请忽略它。本身(例如 interface Example { String toString(); } 中的 toString ),或者具有默认的 impl,例如 interface Example { default String foo() { return ""; } } 中的 foo 。那么,还剩下多少种方法呢?如果答案恰好是 1(不是 0,也不是 2),那么它就是一个函数式接口(interface)。

如果你使用 lambda(箭头符号,或者 typeOrReferenceExpr::someMethod 语法),那么你使用它的地方必须是编译器可以准确地找出想要的函数接口(interface)的地方。如果不能,那就是编译器错误。例如:

Object o = () -> System.out.println("Hello!");

这是一个编译时错误。但这:

Runnable r = () -> System.out.println("Hello!");

没问题; java.lang.Runnable是一个函数式接口(interface),因为它只有1个相关方法,即void run(); .

一旦功能接口(interface)清晰,lambda 就会被解释为该方法的实现。因此,在您的示例中,java 知道 root 的类型, query ,和criteriaBuilder因为编译器可以看出这是接口(interface) Specification<User> 的 impl ,并且该接口(interface)只有一个(非对象、非默认)方法,其规范为:

Predicate toPredicate(Root<User>, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder)

这就是 java 所知道的。它还可以计算出任何 throws子句和返回类型也是如此。

关于java - java 如何知道 lambda 参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59417974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com