我正在使用@Conditional
批注,并且必须提供matches()
接口的Condition
的实现。由于Condition
是FunctionalInterface
,我该如何使用Java 8 lambda在注释中提供实现 ,而不是提供实现。
@Conditional(value = MyCondition.class)
class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return ifMatches;
}
}
答案 0 :(得分:2)
你不能。
Lambda是类的实例,@Conditional
需要类本身。
lambda
Function<String, String> capitalize = text -> text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
在功能上与
相同Function<String, String> capitalize = new Function<String, String>() {
public String apply(String text) {
return Function<String, String> capitalize = text -> text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
}
};
都是匿名类的实例,而不是匿名类本身。无法实际访问匿名类(在反射之外,但不能在批注中使用反射)。
在期望类的地方传递lambda就像在期望类的地方传递String一样。即像这样的东西:
public @interface MyAnnotation {
Class<?> value();
}
@MyAnnotation("this is a string")
public class MyClass {
}
您不会期望的工作。