如何声明方法引用数组?

时间:2018-03-12 12:08:05

标签: java java-8

我知道如何以这种方式声明其他东西的数组,比如字符串:

String[] strings = { "one", "two", "tree" };
// or
String[] strings = new String[] { "one", "two", "tree" };

但是当谈到方法引用时,我无法弄清楚如何避免使用 创建一个列表并单独添加每个项目。

示例:在几个不同的方法上调用方法smartListMerge 来自两个来源的匹配列表:

List<Function<TodoUser, TodoList>> listGetters = new ArrayList<>(3);
listGetters.add(TodoUser::getPendingList);
listGetters.add(TodoUser::getCompletedList);
listGetters.add(TodoUser::getWishList);

TodoUser userA = ..., userB = ...;
for (Function<TodoAppUser, TodoList> listSupplier : listGetters) {
    TodoList sourceList = listSupplier.apply(userA);
    TodoList destinationList = listSupplier.apply(userB);

    smartListMerge(sourceList, destinationList);
}

声明方法引用数组的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

创建列表的方法较短:

List<Function<TodoUser, TodoList>> listGetters = Arrays.asList(TodoUser::getPendingList,
                                                               TodoUser::getCompletedList,
                                                               TodoUser::getWishList);

或(在Java 9中):

List<Function<TodoUser, TodoList>> listGetters = List.of(TodoUser::getPendingList,
                                                         TodoUser::getCompletedList,
                                                         TodoUser::getWishList);

答案 1 :(得分:1)

在你的问题中,你询问了一系列方法。您可以这样定义:

Method toString = String.class.getMethod("toString"); // This needs to catch NoSuchMethodException.
Method[] methods = new Method[] { toString };

然而,在您的示例中,您使用的是函数,您也可以将它放入数组中:

Function<String, String> toStringFunc = String::toString;
Function[] funcs = new Function[] { toStringFunc };

请注意,分别导入第一个java.lang.reflection.Method或第二个示例java.util.function.Function

据我所知,没有用于定义列表的简写。

答案 2 :(得分:0)

您无法创建通用数组,但您可以声明一个(虽然有警告):

@SuppressWarnings("unchecked")
Function<String, Integer>[] arr = new Function[2];
arr[0] = String::length;