code: public static <T,K,V> Collection<T> collectMany(Map<K, V> self, @ClosureParams(MapEntryOrKeyValue.class) Closure<Collection<? extends T>> projection) {
          return collectMany(self, new ArrayList<T>(), projection);
      }
docs: Projects each item from a source map to a result collection and concatenates (flattens) the resulting
  collections adding them into a collection.
  <p>
  <pre class="groovyTestCase">
  def map = [bread:3, milk:5, butter:2]
  def result = map.collectMany{ k, v {@code ->} k.startsWith('b') ? k.toList() : [] }
  assert result == ['b', 'r', 'e', 'a', 'd', 'b', 'u', 't', 't', 'e', 'r']
  </pre>
  
  @param self       a map
  @param projection a projecting Closure returning a collection of items
  @return the collector with the projected collections concatenated (flattened) to it
  @since 1.8.8