如何声明方法引用数组?
我知道如何以这种方式声明其他东西的数组,比如字符串:
String[] strings = { "one", "two", "tree" }; // or String[] strings = new String[] { "one", "two", "tree" };
但是当谈到方法引用时,我无法弄清楚如何避免创建列表并单独添加每个项目。
示例:在两个来源的几个不同匹配列表上调用方法smartListMerge
:
List<Function> listGetters = new ArrayList(3); listGetters.add(TodoUser::getPendingList); listGetters.add(TodoUser::getCompletedList); listGetters.add(TodoUser::getWishList); TodoUser userA = ..., userB = ...; for (Function listSupplier : listGetters) { TodoList sourceList = listSupplier.apply(userA); TodoList destinationList = listSupplier.apply(userB); smartListMerge(sourceList, destinationList); }
声明方法引用数组的正确方法是什么?
创建List的方法较短:
List> listGetters = Arrays.asList(TodoUser::getPendingList, TodoUser::getCompletedList, TodoUser::getWishList);
或(在Java 9中):
List> listGetters = List.of(TodoUser::getPendingList, TodoUser::getCompletedList, TodoUser::getWishList);
在你的问题中,你询问了一系列方法。 您可以这样定义:
Method toString = String.class.getMethod("toString"); // This needs to catch NoSuchMethodException. Method[] methods = new Method[] { toString };
然而,在您的示例中,您使用函数,您也可以将其放入数组中:
Function toStringFunc = String::toString; Function[] funcs = new Function[] { toStringFunc };
请记住,为第一个或第二个示例的java.util.function.Function
分别导入java.lang.reflection.Method
。
据我所知,没有用于定义列表的简写。
你不能创建一个通用数组,但你可以声明一个(虽然有警告):
@SuppressWarnings("unchecked") Function[] arr = new Function[2]; arr[0] = String::length;