我编写了一个为控制台创建输入菜单的方法,该菜单显示多个选项供用户选择,并返回用户选择的选项。该方法接受一个对象数组,并通过调用它们上的toString()
方法显示它们。问题是,在某些情况下,我不想在这些对象上调用toString()
方法,但可能是getName()
方法。因此,我希望能够传递方法引用,可以在对象上调用它并返回String
。
然后我就可以了。传递一组人和getFullName()
方法。这些人将在控制台上以他们的全名显示,但我仍然会返回person对象,我不必通过其全名找到person对象。
这是我目前的方法代码:
/**
* Prints the provided question and the options to choose from
*
* @param question
* the question to ask the user
* @param options
* list of objects the user can choose from
* @return chosen object
*/
public Object getMultipleChoiceResult(String question, List<?> options) {
int result = 0;
while (result > options.size() | result < 1) {
System.out.println(question);
for (int i = 1; i <= options.size(); i++) {
System.out.println("(" + i + ") " + options.get(i - 1).toString());
}
try{
result = scanner.nextInt();
} catch (InputMismatchException e) {
System.err.println("wrong input");
scanner.next();
}
}
return options.get(result - 1);
}
你明白我在找什么,有可能吗?
答案 0 :(得分:2)
我认为你正在寻找这个:
public <T> T getMultipleChoiceResult(String question, List<T> options, Function<T, String> toString) {
// ...
System.out.println("(" + i + ") " + toString.apply(options.get(i - 1)));
// ...
}
在您的示例中,您可以这样调用它:
Object result = getMultipleChoiceResult(question, options, Object::toString);
或者您可以传递Person
列表并打印Person.getFullName()
:
Person result = getMultipleChoiceResult(question, persons, Person::getFullName);
答案 1 :(得分:1)
实现这一目标的方法有很多种。一种相对现代的方法是传递method reference:
private static <T> void showList(List<T> list, Function<T,String> f) {
for (T t : list) {
System.out.println(f.apply(t));
}
}
对此方法的调用如下所示:
showList(myList, MyType::getFullName);
以上假设myList
是List<MyType>
,而MyType
的非静态方法getFullName()
返回String
。