方法参考中的参数

时间:2017-07-02 10:48:48

标签: java lambda java-8 method-reference

是否可以使用方法参考传递参数? 例如,我必须使用TreeMap创建reverseOrder()。 是否存在类似TreeMap::new(reverseOrder())的内容?

4 个答案:

答案 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方法(例如selectWithrejectWithcollectWithdetectWithanySatisfyWith等。) 。这些方法增加了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());