Поставщик как функция

#java

#java

Вопрос:

Как работает следующее? Я передаю a Supplier там, где Function ожидается a .

 class Scratch {
    private Bar bar = new Bar("foo");

    public static void main(String[] args) {
        Scratch scratch = new Scratch();
        System.out.println(scratch.getBarValue(Bar::getValue));
    }

    public <T> T getBarValue(Function<Bar, T> extractor) {
        return extractor.apply(bar);
    }

    static class Bar {
        private String value;

        Bar(String value) {
            this.value = value;
        }

        String getValue() {
            return value;
        }
    }
}
 

Я понимаю, что Java создает функцию от поставщика, но, как ни странно, не может найти никакой документации по этому поводу.

Ответ №1:

getValue() кажется, не принимает аргументов, но на самом деле имеет неявный this параметр.

Обычно это скрывается за синтаксическим сахаром object.method(...) . Однако, когда вы создаете ссылку на метод с :: помощью, неявное this становится явным. getValue() затем обрабатывается как функция с одним аргументом, поскольку она может быть вызвана только в том случае, если она знает, для чего Bar она вызывается.

Это происходит с любым методом экземпляра. Это не относится к static методам; у них нет this .

Ответ №2:

Bar::getValue это функция, которая принимает Bar экземпляр и возвращает строку. Это не поставщик, потому что без Bar экземпляра он не может быть вызван.

Учитывая конкретный экземпляр, bar::getValue это поставщик, потому что он просто получает значение из этого конкретного экземпляра Bar . Но Bar::getValue Bar для его вызова необходимо предоставить экземпляр getValue() . Итак, это Function<Bar, String> .