6
votes

I want to do alot of stuff with each of those example strings and return Object of some other type here Integers, later some bigger class-objects.

Here in this example I am trying something simple, how ever I get a completly wrong result. At least for what i was hoping to get back. xD

I hoped to get: [6, 5, 6, 5] but instead I get: [butter, bread, dragon, table]

package test

@Grab(group='org.codehaus.gpars', module='gpars', version='1.0.0')
import static groovyx.gpars.GParsPool.withPool

class Test {
    List<String> strings = new ArrayList<String>([
        "butter",
        "bread",
        "dragon",
        "table"
    ])

    def closure = { it.length() }

    def doStuff() {
        def results = withPool( 4 ) {
            strings.eachParallel{ it.length()}
        }
        println results
    }

    static main(args) {
        def test = new Test()
        test.doStuff()
    }
}

It would be nice if the answer could have a short explanation. Thanks a lot!

1

1 Answers

12
votes

In groovy, each (and eachParallel in GPars) returns the original collection.

What you want is collect (to return the new collection made by calling the closure)

So, change

        strings.eachParallel { it.length() }

to

        strings.collectParallel { it.length() }

(btw)

GPars now comes bundled with Groovy so you shouldn't need the @Grab, and I assume you meant to use your closure variable in the collect?

package test

import static groovyx.gpars.GParsPool.withPool

class Test {
  List<String> strings =  [ "butter", "bread", "dragon", "table" ]

  def closure = { it.length() }

  def doStuff() {
    def results = withPool( 4 ) {
      strings.collectParallel closure
    }
    println results
  }

  static main( args ) {
    def test = new Test()
    test.doStuff()
  }
}