Пользовательские цепочки предикатов - PullRequest
0 голосов
/ 29 сентября 2018

Я изучаю Java 8.Я пытаюсь создать пользовательский метод цепочки предикатов, как показано ниже

@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<T> other){
        return t -> this.test(t) && other.test(t);
    }
}

Когда я определяю свой предикат, как указано выше, он работает, но если я пытаюсь реализовать то же, что и ниже, он дает мне исключение StackOverflow

@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);
            }
        };
    }
}

Не могли бы вы объяснить, почему он дает мне исключение stackoverflow в стиле Java 7, тогда как не давайте никаких исключений, если я определяю его с помощью лямбды.

1 Ответ

0 голосов
/ 29 сентября 2018

test(t) является рекурсивным вызовом самому себе, поскольку неквалифицированный вызов относится к анонимному классу.

Так будет this.test(t), поскольку this относится к анонимному классу.

Изменить на Predicate.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);
            }
        };
    }
}

См. ответ на "Lambda this reference in java" для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...