code: public static <T, U extends T, V extends T,A,B> T findResult(Map<A, B> self, U defaultResult, @ClosureParams(MapEntryOrKeyValue.class) Closure<V> closure) {
          T result = findResult(self, closure);
          if (result == null) return defaultResult;
          return result;
      }
docs: Returns the first non-null closure result found by passing each map entry to the closure, otherwise the defaultResult is returned.
  If the closure takes two parameters, the entry key and value are passed.
  If the closure takes one parameter, the Map.Entry object is passed.
  <pre class="groovyTestCase">
  assert "Found b:3" == [a:1, b:3].findResult("default") { if (it.value == 3) return "Found ${it.key}:${it.value}" }
  assert "default" == [a:1, b:3].findResult("default") { if (it.value == 9) return "Found ${it.key}:${it.value}" }
  assert "Found a:1" == [a:1, b:3].findResult("default") { k, v -> if (k.size() + v == 2) return "Found $k:$v" }
  </pre>
  
  @param self    a Map
  @param defaultResult an Object that should be returned if all closure results are null
  @param closure a 1 or 2 arg Closure that returns a non-null value when processing should stop and a value should be returned
  @return the first non-null result collected by calling the closure, or the defaultResult if no such result was found
  @since 1.7.5