我知道如何以这种方式声明其他东西的数组,比如字符串:
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);
}
声明方法引用数组的正确方法是什么?
答案 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;