#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
, когда вы просто возвращаете aString
?3. Я не думаю, что этот вопрос нужно закрывать
Ответ №1:
То, что вы делаете, не имеет особого смысла. Вы объявляете Function<String, String>
функцию внутри функции, но не используете ее. Кроме того, я не уверен, какова цель параметра, который вы передаете функции.
Основываясь на вашем коде, я определил три варианта, которые имели бы смысл, но, судя по названию вашего вопроса, я бы предположил, что вы ищете решение 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");
- Сохраните параметр, но
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();
- Верните 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 Я чувствую, что просто слепо отвечаю на вопрос, не предлагая ОП, что то, что они пытаются сделать, не очень разумно, противоречит духу ТАК