[ https://issues.apache.org/jira/browse/GROOVY-11606?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17942063#comment-17942063 ]
Paul King edited comment on GROOVY-11606 at 4/9/25 2:36 AM: ------------------------------------------------------------ For the draft implementation, I have followed the Groovy-stream approach of setting the delegate. It means we can have code like this \(*): {code:groovy} var letters = Iterators.iterate('a', String::next) var numbers = Iterators.iterate(0, Integer::next) assert Iterators.combineLazy(true, x:letters, y:numbers) .collectLazy{ x + y } // <<<===== (*) .take(8) .join(' ') == 'a0 a1 b0 b1 a2 b2 c0 c1' {code} Instead of this: {code:groovy} var letters = Iterators.iterate('a', String::next) var numbers = Iterators.iterate(0, Integer::next) assert Iterators.combineLazy(true, x:letters, y:numbers) .map{ it.x + it.y } // <<<===== (*) .take(8) .join(' ') == 'a0 a1 b0 b1 a2 b2 c0 c1' {code} Another example: {code:groovy} assert [ [a:3, b:4, c:5], [a:5, b:12, c:13], [a:8, b:15, c:17], [a:7, b:24, c:25] ].iterator().collectLazy { c == Math.sqrt(a ** 2 + b ** 2) }.join(' ') == 'true true true true' {code} An alternative using "with": {code:groovy} assert [ [a:3, b:4, c:5], [a:5, b:12, c:13], [a:8, b:15, c:17], [a:7, b:24, c:25] ].iterator().map { it.with { c == Math.sqrt(a ** 2 + b ** 2) } }.join(' ') == 'true true true true' {code} An example with "findAllLazy": {code:groovy} assert [ [a:1, b:2, c:3], [a:5, b:15, c:10], [a:10, b:20, c:30] ].iterator().findAllLazy { a + b == c }.join(' ') == '[a:1, b:2, c:3] [a:10, b:20, c:30]' {code} Using "filter": {code:groovy} assert [ [a:1, b:2, c:3], [a:5, b:15, c:10], [a:10, b:20, c:30] ].iterator().filter { it.a + it.b == it.c }.join(' ') == '[a:1, b:2, c:3] [a:10, b:20, c:30]' {code} My summary: * The code when the delegate is set is definitely nicer * It does have some performance impacts since, so as not to pollute the closure state, we clone it before setting the delegate * Also, if we do this for some of the methods, folks might expect for consistency, that we do it for all of them (which we could do but we'd have to analyse whether that would break existing code) was (Author: paulk): For the draft implementation, I have followed the Groovy-stream approach of setting the delegate. It means we can have code like this \(*): {code:groovy} var letters = Iterators.iterate('a', String::next) var numbers = Iterators.iterate(0, Integer::next) assert Iterators.combineLazy(true, x:letters, y:numbers) .collectLazy{ x + y } // <<<===== (*) .take(8) .join(' ') == 'a0 a1 b0 b1 a2 b2 c0 c1' {code} Instead of this: {code:groovy} var letters = Iterators.iterate('a', String::next) var numbers = Iterators.iterate(0, Integer::next) assert Iterators.combineLazy(true, x:letters, y:numbers) .map{ it.x + it.y } // <<<===== (*) .take(8) .join(' ') == 'a0 a1 b0 b1 a2 b2 c0 c1' {code} Another example: {code:groovy} assert [ [a:3, b:4, c:5], [a:5, b:12, c:13], [a:8, b:15, c:17], [a:7, b:24, c:25] ].iterator().collectLazy { c == Math.sqrt(a ** 2 + b ** 2) }.join(' ') == 'true true true true' {code} An alternative using "with": {code:groovy} assert [ [a:3, b:4, c:5], [a:5, b:12, c:13], [a:8, b:15, c:17], [a:7, b:24, c:25] ].iterator().map { it.with { c == Math.sqrt(a ** 2 + b ** 2) } }.join(' ') == 'true true true true' {code} An example with "findAllLazy": {code:groovy} assert [ [a:1, b:2, c:3], [a:5, b:15, c:10], [a:10, b:20, c:30] ].iterator().findAllLazy { a + b == c }.join(' ') == '[a:1, b:2, c:3] [a:10, b:20, c:30]' {code} Using "filter": {code:groovy} assert [ [a:1, b:2, c:3], [a:5, b:15, c:10], [a:10, b:20, c:30] ].iterator().filter { it.a + it.b == it.c }.join(' ') == '[a:1, b:2, c:3] [a:10, b:20, c:30]' {code} > Lazy findAll, collect, collectMany > ---------------------------------- > > Key: GROOVY-11606 > URL: https://issues.apache.org/jira/browse/GROOVY-11606 > Project: Groovy > Issue Type: Improvement > Reporter: Paul King > Assignee: Paul King > Priority: Major > > See: > https://lists.apache.org/thread/xv1bpgc7xp3rwp7qt627xfyd10ljcwbc -- This message was sent by Atlassian Jira (v8.20.10#820010)