如何调用Java';groovy中的s Stream.collect()?

如何调用Java';groovy中的s Stream.collect()?,java,groovy,java-stream,Java,Groovy,Java Stream,有一些Scala的FP背景知识,我真的不喜欢Groovy的集合方法名称。考虑到这一点以及上面所做的一些架构选择,我发现在Groovy代码中使用Java8StreamsAPI(加上Java.util.Optional)是一个很有吸引力的解决方案 直到我碰到这个: def finalCollection = [ 'some', 'items', 'really', 'not', 'important' ].stream() .map { aMethodReturningOptiona

有一些Scala的FP背景知识,我真的不喜欢Groovy的集合方法名称。考虑到这一点以及上面所做的一些架构选择,我发现在Groovy代码中使用Java8StreamsAPI(加上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!
对我来说,调用某些扩展方法而不是类的本机“内置”方法似乎与直觉相反

如何重写该示例,以便调用
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<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']
import java.util.stream*
类项目{
最终字符串名
项目(名称){
this.name=name
}
@凌驾
字符串toString(){
名称
}
}
def itemize(字符串名称){
可选。of(新项目(名称))
}
def finalCollection=['some','items','really','not','important'].stream()
.map{itemize(it)}//将字符串映射到可选
.flatMap{it.map(Stream&of).orElseGet(Stream&empty)}//转换为流
.collect(收集器.toList())
断言'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()
def finalCollection=['some','items','really','not','important'].stream()
.map{itemize(it)}//将字符串映射到可选
.flatMap{it.map(Stream&of).orElseGet(Stream&empty)}//转换为流
.collect()
它使用:

使用Closure.IDENTITY作为 transformer,基本上返回从 原始对象


那么,如果调用
collect(Collectors.toList())
,而不是
collect()
,会发生什么呢?我不是groovy专家,但既然您调用collect()时没有参数,为什么groovy会调用Stream.collect(),因为该方法需要一个收集器作为参数?我同意@JBNizet……如果您调用groovy方法,它将使用groovy方法。试着调用Java8方法?好的,经过更多的实验,我发现了我遇到的问题。在最初的实验中,我编写了
collect{Collectors.toList()}
(注意大括号),这当然不是它应该的样子。我真傻。
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()