Задать вопрос
evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему функциональный метод принимает 2 параметра, а реализация принимает один, но в использовании указываются 2 аргумента?

Есть вот такой пример кода:
interface MyFunc<T> {
    boolean func(T a, T b);
}

class HighTemp {
    private int hTemp;

    public HighTemp(int hTemp) {
        this.hTemp = hTemp;
    }

    boolean sameTemp(HighTemp hTemp2) {
        return hTemp == hTemp2.hTemp;
    }

    boolean lessThanTemp(HighTemp hTemp2) {
        return hTemp < hTemp2.hTemp;
    }
}

class App {
    static <T> int counter(T[] vals, MyFunc<T> f, T v) {
        int count = 0;

        for (int i = 0; i < vals.length; i++) {
            if (f.func(vals[i], v)) {
                count++;
            }
        }

        return count;
    }

    public static void main(String[] args) {
        int count;

        HighTemp[] weekDayHighs = {
            new HighTemp(89),
            new HighTemp(82),
            new HighTemp(90),
            new HighTemp(89),
            new HighTemp(89),
            new HighTemp(91),
            new HighTemp(84),
            new HighTemp(83)
        };

        count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));

        System.out.println("Дней, когда максимальная температура была 89: " + count);

        HighTemp[] weekDayHighs2 = {
            new HighTemp(32),
            new HighTemp(12),
            new HighTemp(24),
            new HighTemp(19),
            new HighTemp(18),
            new HighTemp(12),
            new HighTemp(-1),
            new HighTemp(13)
        };

        count = counter(weekDayHighs2, HighTemp::sameTemp, new HighTemp(12));

        System.out.println("Дней, когда максимальная температура была 12: " + count);

        count = counter(weekDayHighs, HighTemp::lessThanTemp, new HighTemp(89));

        System.out.println("Дней, когда максимальная температура была меньше 89: " + count);

        count = counter(weekDayHighs2, HighTemp::lessThanTemp, new HighTemp(19));

        System.out.println("Дней, когда максимальная температура была меньше 19: " + count);
    }
}


Есть обобщенный функциональный интерфейс. В нем есть метод с 2мя параметрами.
Но почему в counter передается метод (например HighTemp::sameTemp), который принимает 1 аргумент? По идеи же этот метод потом записывается в реализации интерфейса в место метода func, но в нем же 2 параметра. Почему потом метод func потом опять принимает 2 аргумента если его реализация (например HighTemp::sameTemp) принимает всего один??

Описал вопрос как смог, сам ничего не понимаю. Никак не доходит что происходит в коде.
  • Вопрос задан
  • 149 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vestail
@Vestail
Software Engineer
MyFunc<HighTemp> func = HighTemp::sameTemp;
тоже самое что и
MyFunc<HighTemp> func = new MyFunc<HighTemp>() {
    @Override
    boolean func(HighTemp a, HighTemp b) {
          a.sameTemp(b);
    }
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы