如何在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

我有什么建议可以实现吗?

解决方法

仅自 Groovy 起支持创建 lambda 的 :: 快捷方式 3.0.使用上述版本,您的代码应该可以正常工作。

然而, 您想要做的事情在 Groovy 中已经有很长一段时间的快捷方式 很久。您可以使用价差运算符 *.,它会给您一个 ArrayList 回来了。例如。 list*.name 是编写它的“常规”方式。

这里的主要区别在于,此操作急切。如果你 需要 Java 流的惰性(例如,因为您的示例是 简化),那么你总是可以使用 Groovy 闭包而不是 一个拉姆达。可能需要演员阵容,但 Groovy 通常认为 这个东西很好。

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

,

您只能像这样使用 Collection::collect

list.collect{it.name}

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

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

Groovy demo

,

这个场景在我看来过于复杂。

如果你只是想重写java的

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

进入 Groovy,您只需:

list*.name

或(吸气剂)

list*.getName()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...