从Scala获得FP的一些背景我真的不喜欢Groovy的集合方法名称.考虑到上面提到的一些架构选择,我发现在Groovy代码中使用Java 8流API(加上java.util.Optional)是一个吸引人的解决方案.
直到我点击这个:
def finalCollection = [ 'some', 'items', 'really', 'not', 'important' ].stream()
.map { aMethodReturningOptional(it) } //map String to Optional<Item>
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream<Item>
.collect() //Groovy's collect, not stream's!
请注意,它仅适用于Groovy 2 – treating closure as lambda.
困扰我的是示例代码的最后一行. Groovy将调用转换为DefaultGroovyMethods.collect()而不是我最初想要使用的Stream.collect().当然最后一行是:
.collect(Collectors.toList()) //Should call Java collect, but it doesn't
这对我来说似乎是违反直觉的,有些扩展方法被调用而不是本机的“内置”方法.
如何重写示例以便调用Stream.collect()方法?
更新:经过一些更多的摆弄,我发现我原来有什么问题.我写了.collect {Collectors.toList()}(注意花括号),当然称为Groovy方法,而不是Java.自我注意:记得在发布之前进行四重检查…
解决方法:
使用Collectors.toList()
,您可以获得您想要做的事情:
import java.util.stream.*
class Item {
final String name
Item(name) {
this.name = name
}
@Override
String toString() {
name
}
}
def itemize(String name) {
Optional.of(new Item(name))
}
def finalCollection = [ 'some', 'items', 'really', 'not', 'important' ].stream()
.map { itemize(it) } //map String to Optional<Item>
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream<Item>
.collect (Collectors.toList())
assert 'java.util.ArrayList' == finalCollection.class.name
assert finalCollection.collect { it.name } == ['some', 'items', 'really', 'not', 'important']
无论如何,通过groovy 2.4.5上面也正在使用
def finalCollection = [ 'some', 'items', 'really', 'not', 'important' ].stream()
.map { itemize(it) } //map String to Optional<Item>
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream<Item>
.collect()
transforming each item into a new value using Closure.IDENTITY as a
transformer, basically returning a list of items copied from the
original object.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。