问题描述
我正在尝试在 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})
,
这个场景在我看来过于复杂。
如果你只是想重写java的
list.stream().map(User::getName).collect(Collectors.toList())
进入 Groovy,您只需:
list*.name
或(吸气剂)
list*.getName()