«Методы», о которых вы говорите, называются лямбдами, и они являются мощным инструментом, потому что они больше, чем они изначально кажутся.На первый взгляд лямбда - это не что иное, как поведение, заключенное в тонкий синтаксис.Но на самом деле лямбда может сделать гораздо больше.
Например, лямбда-значения 'захвата', которые они используют из соответствующей области во время создания:
...
final MyType t = someObject;
Runnable runner = () -> t.someMethod();
return runner;
...
...
runner.run();
Это на самом деле вызов someMethod
объекта someObject
.Это означает, что лямбда на самом деле имеет контекст в позиции, в которой она создается, в отличие от того, где она вызывается.
Но есть и другое: вы можете фактически передать только метод (как вы описываете), еслиметод соответствует определенной сигнатуре ожидаемого интерфейса:
List<String> myStrings = ...;
myStrings.forEach(System.out::println);
Как вы можете видеть, вы можете связывать специфичные для объекта методы, а не только статические.Еще раз вы передали контекст.
Теперь к конкретному вопросу: зачем возвращать лямбда-метод из вызова метода?
Map<String, Consumer<String>> handlers = new HashMap<>();
...
public Consumer<String> getHandler(String key) {
Consumer<String> h = handlers.get(key);
if (h == null) {
return System.out::println;
}
return h;
}
Теперь вы можете связать обработчик, который вы храните где-то в центрек другому объекту, для которого вы определяете поведение.