方法参考中的参数

parameters in method reference

是否可以使用方法引用传递参数? 例如,我必须创建一个 TreeMap 但使用 reverseOrder()TreeMap::new(reverseOrder()) 之类的东西退出了吗?

为此您需要一个 lambda 表达式...您可能正在考虑 Supplier:

() -> new TreeMap<>(Comparator.reverseOrder())

不,您不能使用方法参考来做到这一点。

您可以改用 lambda 表达式:

() -> new TreeMap<TheRelevantType>(reverseOrder())

() -> new TreeMap<>(reverseOrder())

如果您在编译器可以推断 TreeMap 的元素类型的上下文中使用此表达式。

方法引用本身不支持(今天),但在许多情况下,方法引用可以使用 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 的 Map.computeIfAbsent() 方法,它采用 Function 并将密钥作为参数传递,与 Eclipse Collections 的 MutableMap.getIfAbsentPutWith() 方法它还采用 Function 并传递了一个附加参数。在 JDK 示例中,我必须使用 lambda。在 EC 示例中,我可以使用 TreeSet::new 构造函数引用并将 Comparator.<String>reverseOrder() 指定为我想要传递给它的参数。

Eclipse 集合中有许多 *With 方法可用(例如 selectWithrejectWithcollectWithdetectWithanySatisfyWith 等.).这些方法增加了Java8.

中方法引用可以使用的地方总数

您将在 Eclipse Collections Katas 中找到与参数一起使用的方法引用示例。

Company Kata -> Exercise 2 Test
Pet Kata -> Exercise 2 Test

注意:我是 Eclipse Collections 的提交者。

您不能在 Java 中使用带参数的方法引用。您必须改用 lambda 表达式:

Supplier<Map<String, String>> factory = () ->
        new TreeMap<>(Comparator.reverseOrder());

但是,如果出于某种原因,您 want/need 仍然要使用方法引用,这里有一种使用辅助方法的方法:

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());