Java 8 - Что такое реальный сценарий использования метода возврата из другого метода? - PullRequest
0 голосов
/ 26 февраля 2019

Как мы знаем, Java 8 поддерживает функциональное программирование.

Мы можем передать метод в качестве параметра и вернуть метод из другого метода.

Я знаю, что обратный вызов является одним из реальныхвремя использования для передачи метода в качестве параметра.Но я не смог найти ни одного реального варианта использования метода для возврата из другого метода.Пожалуйста, дайте мне пример реального времени для этого.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

«Методы», о которых вы говорите, называются лямбдами, и они являются мощным инструментом, потому что они больше, чем они изначально кажутся.На первый взгляд лямбда - это не что иное, как поведение, заключенное в тонкий синтаксис.Но на самом деле лямбда может сделать гораздо больше.

Например, лямбда-значения 'захвата', которые они используют из соответствующей области во время создания:

...
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;
}

Теперь вы можете связать обработчик, который вы храните где-то в центрек другому объекту, для которого вы определяете поведение.

0 голосов
/ 26 февраля 2019

Существует множество примеров получения / возврата функциональных интерфейсов в самом JDK.

Вот некоторые очевидные варианты использования:

"Стандартная" логика :

Function.identity() //standard implementation for obj -> obj

Логическая цепочка (состав функции):

Function<String, String> upperCase = String::toUpperCase;
Function<String, String> upperCaseAndTrim = upperCase.andThen(String::trim);

andThen представляет собой набор функций, и логично вернуть только функциональный интерфейс.

И соответствующий вариант использования:

ToIntFunction<String> intExtractor = String::length;
Comparator<String> stringLengthComparator = Comparator.comparingInt(intExtractor);

Здесь Comparator создается стандартный компаратор int, принимающий функцию, которая знает, как получить int изтип элемента коллекции.

Вероятно, это еще один случай составных функций :

Predicate<String> isValid = s -> s.length() <= 10;
Predicate<String> isInvalid = isValid.negate();

negate() обращает логику, реализованную в оригинальном методе.

...