方法参考中的参数
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
方法可用(例如 selectWith
、rejectWith
、collectWith
、detectWith
、anySatisfyWith
等.).这些方法增加了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());
是否可以使用方法引用传递参数?
例如,我必须创建一个 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
方法可用(例如 selectWith
、rejectWith
、collectWith
、detectWith
、anySatisfyWith
等.).这些方法增加了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());