概述
从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
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream
.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.自我注意:记得在发布之前进行四重检查…
解决方法:
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
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream
.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
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream
.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.
标签:java,groovy,java-stream
来源: https://codeday.me/bug/20190623/1271888.html
最后
以上就是鲤鱼服饰为你收集整理的grails 调用java_如何从groovy调用Java的Stream.collect()?的全部内容,希望文章能够帮你解决grails 调用java_如何从groovy调用Java的Stream.collect()?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复