Потребитель Java с возвратом

Я не понимаю, почему этот код работает:

class Resource {
    private Resource() {
        System.out.println("created...");
    }
    public Resource op1() {
        System.out.println("op1");
        return this;
    }
    public Resource op2() {
        System.out.println("op2");
        return this;
    }
    private void close() {
        System.out.println("clean up...");
    }
    public static void use(Consumer<Resource> block) {
        Resource resource = new Resource();
        try {
            block.accept(resource);
        }
        finally {
            resource.close();
        }
    }
}

// method call

public class App 
{
    public static void main( String[] args )
    {
      Consumer<Resource> block = resource -> resource.op1().op2(); //here
      Resource.use(block);
    }
}

Потребитель должен принять один параметр и вернуть пустоту. Но в этом примере Consumer берет один параметр (ресурс) и возвращает этот параметр. Почему это работает, хотя я возвращаю экземпляр ресурса вместо пустоты?

потому что вы возвращаете экземпляр Resource. Проверьте подпись методов op1 и op2.

Stultuske 03.02.2019 15:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш Consumer<Resource> block = resource -> resource.op1().op2(); эквивалентен:

Consumer<Resource> block = new Consumer<Resource>() {
        @Override
        public void accept(Resource resource) {
            resource.op1().op2();  // there is no return statement
        }
    };

вопрос касается методов op1 и op2. Это даже указано как таковое в вопросе

Stultuske 03.02.2019 16:06

Параметр метода accept должен быть типа Resource вместо String, но я понимаю ответ. Спасибо.

sakajato 03.02.2019 16:29

Другие вопросы по теме