是否可以使用方法参考传递参数?
例如,我必须使用TreeMap
创建reverseOrder()
。
是否存在类似TreeMap::new(reverseOrder())
的内容?
答案 0 :(得分:6)
不,你不能用方法参考来做。
您可以改为使用lambda表达式:
() -> new TreeMap<TheRelevantType>(reverseOrder())
或
() -> new TreeMap<>(reverseOrder())
如果您在编译器可以推断TreeMap
的元素类型的上下文中使用此表达式。
答案 1 :(得分:5)
你需要一个lambda表达式...你可能正在考虑Supplier
:
() -> new TreeMap<>(Comparator.reverseOrder())
答案 2 :(得分:1)
方法引用本身(今天)不支持这种方法,但在很多情况下,方法引用可以与Eclipse Collections API的参数一起使用。请看以下示例:
Map<String, TreeSet<String>> jdkMap = new HashMap<>();
jdkMap.put("one", new TreeSet<>(Comparator.reverseOrder()));
jdkMap.computeIfAbsent("two", key -> new TreeSet<>(Comparator.reverseOrder()));
MutableMap<String, TreeSet<String>> ecMap =
Maps.mutable.with("one", new TreeSet<>(Comparator.reverseOrder()));
ecMap.getIfAbsentPutWith("two", TreeSet::new, Comparator.<String>reverseOrder());
Assert.assertEquals(jdkMap, ecMap);
在这里,我使用JDK&#39; Map.computeIfAbsent()
方法进行比较,该方法采用Function
并将密钥作为参数传递,Eclipse Collections&#39; MutableMap.getIfAbsentPutWith()
方法,该方法也需要Function
并传递一个附加参数。在JDK示例中,我必须使用lambda。在EC示例中,我能够使用TreeSet::new
构造函数引用并指定Comparator.<String>reverseOrder()
作为我想传递给它的参数。
Eclipse集合中有许多*With
方法(例如selectWith
,rejectWith
,collectWith
,detectWith
,anySatisfyWith
等。) 。这些方法增加了Java 8中方法引用可以使用的位置总数。
您将在Eclipse Collections Katas中找到与参数一起使用的方法引用的示例。
Company Kata -> Exercise 2 Test
Pet Kata -> Exercise 2 Test
注意:我是Eclipse Collections的提交者。
答案 3 :(得分:1)
您不能在Java中使用带参数的方法引用。您必须改为使用lambda表达式:
Supplier<Map<String, String>> factory = () ->
new TreeMap<>(Comparator.reverseOrder());
但是,无论出于何种原因,无论如何,你想要/需要使用方法引用,这里有一种方法可以使用辅助方法:
public static <T, U> Supplier<T> withArg(
Function<? super U, ? extends T> methodRef,
U arg) {
return () -> methodRef.apply(arg);
}
Supplier<Map<String, String>> factory = withArg(
TreeMap::new,
Comparator.<String>reverseOrder());