如何在groovy中声明方法引用?

How to declare method reference in groovy?

我正在尝试使用 groovy 中的方法参考。我无法让它工作。

以下工作在groovy。

选项 2> list.stream().map(user -> user.getName()).collect(Collectors.toList())

我想达到什么目的?

选项 1> list.stream().map(User::getName).collect(Collectors.toList())

上面的调用给出了以下错误。

unexpected token: : @ line 33, column 14.
User::getName
1 error

有什么建议可以实现吗?

你只能这样使用Collection::collect

list.collect{it.name}

您还可以指定收集器类型,例如,如果您想使用 .collect(Collectors.toSet()) 的等价物,您可以使用:

list.collect(new HashSet(), {it.name})

Groovy demo

创建 lambda 的 :: 快捷方式仅在 Groovy 之后才受支持 3.0。使用所述版本,您的代码应该可以正常工作。

然而, 你想做什么那里已经有快捷方式 Groovy 很久。您可以使用扩展运算符 *.,它会给您一个 ArrayList回来了。例如。 list*.name 是“groovy”的写法。

这里的主要区别在于,此操作是 eager。如果你 需要 Java 流的惰性(例如因为你的例子是 简化),那么你总是可以使用 Groovy 闭包而不是 一个拉姆达。可能需要演员表,但 Groovy 通常是人物 这件事很好。

例如:list.stream().map{ it.name }.collect(Collectors.toList())

我觉得这个场景太复杂了。

如果你只是想重写java的

list.stream().map(User::getName).collect(Collectors.toList())

进入Groovy,你只需得到:

list*.name

或(getter)

list*.getName()