Как вернуть интерфейс функции из статической функции?

#java #functional-programming

Вопрос:

Я использую Function<String, String> внутри статический метод, который, как ожидается, вернет значение

Это принимает входные данные и возвращает выходные данные, как вернуть значение обратно из метода?

 public static String getAnimalName(String name)
{
    Function<String, String> getNameFunc = (inputName)->
    {
        return  inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
    };
    return "";
}
 

Комментарии:

1. Измените свою функцию, чтобы на самом деле возвращать a Function<String, String> , а затем return getNameFunc (или return inputName -> inputName.equalsIgnoreCase("cat") ? "dog" : "rat"; ?

2. Почему вы используете a Function , когда вы просто возвращаете a String ?

3. Я не думаю, что этот вопрос нужно закрывать

Ответ №1:

То, что вы делаете, не имеет особого смысла. Вы объявляете Function<String, String> функцию внутри функции, но не используете ее. Кроме того, я не уверен, какова цель параметра, который вы передаете функции.

Основываясь на вашем коде, я определил три варианта, которые имели бы смысл, но, судя по названию вашего вопроса, я бы предположил, что вы ищете решение 1.

  1. Верните значение a Function<String, String> и удалите параметр из getAnimalNameFunction
     public static Function<String, String> getAnimalNameFunction() {
        Function<String, String> getNameFunc = (inputName) -> {
            return inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
        };
        return getNameFunc;
    }
     

    а затем в каком-то другом коде..

     Function<String, String> nameConverter = getAnimalNameFunction();
    String name = nameConverter.apply("cow");
     
  2. Сохраните параметр, но Supplier<String> вместо этого верните a:
     public static Supplier<String> getAnimalNameSupplier(String name) {
        Supplier<String> getNameSup = () -> {
            return name.equalsIgnoreCase("cat") ? "dog" : "rat";
        };
        return getNameSup;
    }
     

    а затем в каком-то другом коде..

     Supplier<String> nameGetter = getAnimalNameSupplier("cow");
    String name = nameGetter.get();
     
  3. Верните a String (как вы делали изначально) и удалите промежуточный Function<String, String>
     public static String getAnimalName(String name)
    {
        return name.equalsIgnoreCase("cat") ? "dog" : "rat";
    }
     

    а затем в каком-то другом коде..

     String name = getAnimalName();
     

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

Ответ №2:

Интерфейс java.util.function.Function содержит один абстрактный метод с именем apply . Следовательно, вам нужно явно вызвать этот метод.

Лямбда-выражение является фактической реализацией интерфейса.

 public static String getAnimalName(String name) {
    Function<String, String> getNameFunc = (inputName) -> {
        return inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
    };
    return getNameFunc.apply(name);
}
 

Обратите внимание, что вы можете упростить лямбда-выражение до

 Function<String, String> getNameFunc = inputName -> inputName.equalsIgnoreCase("cat") ? "dog" : "rat";
 

Комментарии:

1. В таком случае, зачем в первую очередь создавать объект функции, а не просто реализовывать все getAnimalMethod тело как return name.equalsIgnoreCase("cat") ? "dog" : "rat"; ?

2. @Abra Я чувствую, что просто слепо отвечаю на вопрос, не предлагая ОП, что то, что они пытаются сделать, не очень разумно, противоречит духу ТАК