Java – custom predicate link
•
Java
I'm learning java 8 I'm trying to create a custom predict link method, as shown below
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<T> other){
return t -> this.test(t) && other.test(t);
}
}
It works when I define my predicate as described above, but if I try to implement it the same as below, it will give me a stackoverflow exception
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<T> other){
//return t -> this.test(t) && other.test(t);
return new Predicate<T>() {
@Override
public boolean test(T t) {
return test(t) && other.test(t);
}
};
}
}
You can explain why it gives me a Java 7 style stack overflow exception, and if I define it with lambda, don't give any exceptions
Solution
Test (T) is a recursive call to itself because the unqualified call is an anonymous class
So this Test (T) is because it refers to anonymous classes
Change to predict this. test(t)
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<T> other){
//return t -> this.test(t) && other.test(t);
return new Predicate<T>() {
@Override
public boolean test(T t) {
return Predicate.this.test(t) && other.test(t);
}
};
}
}
For details, see answer to "lambda this reference in Java"
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
