如何从groovy调用Java的Stream.collect()?

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()

使用groovy’s 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] 举报,一经查实,本站将立刻删除。

相关推荐