如何提供对象以及对该类对象的方法引用?

时间:2017-12-26 22:00:36

标签: java method-reference

我编写了一个为控制台创建输入菜单的方法,该菜单显示多个选项供用户选择,并返回用户选择的选项。该方法接受一个对象数组,并通过调用它们上的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);
}

你明白我在找什么,有可能吗?

2 个答案:

答案 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);

以上假设myListList<MyType>,而MyType的非静态方法getFullName()返回String

Demo.