Groovy中链式函数方法的惰性评估 我在Java中看到的

Groovy中链式函数方法的惰性评估 我在Java中看到的,groovy,functional-programming,closures,java-8,lazy-evaluation,Groovy,Functional Programming,Closures,Java 8,Lazy Evaluation,Java8允许对链式函数进行延迟计算,以避免性能损失 例如,我可以有一个值列表,并按如下方式处理: someList.stream() .filter( v -> v > 0) .map( v -> v * 4) .filter( v -> v < 100) .findFirst(); 从语义上讲,这可以改写为 collectionOfSomeStrings.grep{ !it.contains('h

Java8允许对链式函数进行延迟计算,以避免性能损失

例如,我可以有一个值列表,并按如下方式处理:

someList.stream()
        .filter( v -> v > 0)
        .map( v -> v * 4)
        .filter( v -> v < 100)
        .findFirst();
从语义上讲,这可以改写为

collectionOfSomeStrings.grep{ !it.contains('homepage')}.collect{ it.trim() }
我发现它更容易理解,但可读性是有代价的。此代码需要传递原始集合,并对
grep
的结果进行另一次迭代。这不太理想

它看起来不像GDK的
grep
collect
findAll
方法像Java8的streams API中的方法一样被惰性地评估。有没有办法让他们这样做?Groovy中是否有我可以使用的替代库

我想在Groovy中以某种方式使用Java8并具有此功能是可能的。我欢迎对细节进行解释,但在理想情况下,我希望能够使用较旧版本的Java实现这一点

我找到了一份工作,但这不是我真正想做的。我不仅要链接闭包本身,还要链接传递给它们的函数


谷歌搜索Groovy和Streams通常会得到与I/O相关的结果。通过搜索lazy evaluation、functional和Groovy,我没有找到任何感兴趣的内容。

以cfrick的评论为例添加建议作为答案:

@Grab( 'com.bloidonia:groovy-stream:0.8.1' )
import groovy.stream.Stream

List integers = [ -1, 1, 2, 3, 4 ]

//.first() or .last() whatever is needed
Stream.from integers filter{ it > 0 } map{ it * 4 } filter{ it < 15 }.collect()
@Grab('com.bloidonia:groovy stream:0.8.1')
导入groovy.stream.stream
列出整数=[-1,1,2,3,4]
//.first()或.last()所需的任何内容
Stream.from整数过滤器{it>0}映射{it*4}过滤器{it<15}.collect()

蒂姆,我仍然知道你几个夏天前做了什么

groovy2.3支持jdk8groovy.codehaus.org/Groovy+2.3+发行版+注释。您的示例使用groovy闭包可以很好地工作:

[-1,1,2,3,4].stream().filter{it>0}.map{it*4}.filter{it < 100}.findFirst().get()
[-1,1,2,3,4].stream().filter{it>0}.map{it*4}.filter{it<100}.findFirst().get()
如果您不能使用jdk8,您可以按照另一个答案的建议进行操作,或者使用以下方法实现“相同”:

@Grab('com.netflix.rxjava:rxjavagroovy:0.20.7')
进口接收。可观察
可观察的。从([-1,1,2,3,4666])
.filter{println“f1$it;it>0}
.map{println“m1$it;it*4}
.filter{println“f2$it;it<100}
.subscribe{println“result$it”}

groovy 2.3支持jdk8。使用groovy闭包,您的示例工作得很好:
[-1,1,2,3,4].stream().filter{it>0}.map{it*4}.filter{it<100}.findFirst().get()
@cfrick我可以用JDK的早期版本实现这样的结果吗?不。这实际上使用了JDK8 API,但可以使用闭包代替lambdassure,让我们看看其他人怎么说。也许像rxgroovy这样的东西可以为您工作?
Stream.from integers filter{println“filter1$it”;it>0}map{println“map$it”;it*4}filter{println”filter2$it;it<15}.collect()
根据输出判断,这就是我想要的。酷!PS:不久前有一个关于最新版本@tim_yates的博客,谢谢你的链接,特别是图书馆。迫不及待地想在工作中使用它。
[-1,1,2,3,4].stream().filter{it>0}.map{it*4}.filter{it < 100}.findFirst().get()
@Grab('com.netflix.rxjava:rxjava-groovy:0.20.7')
import rx.Observable
Observable.from( [-1, 1, 2, 3, 4, 666] )
    .filter { println "f1 $it"; it > 0 }
    .map { println "m1 $it"; it * 4 }
    .filter { println "f2 $it"; it < 100 }
    .subscribe { println "result $it" }