in src/main/java/net/hydromatic/linq4j/EnumerableDefaults.java [725:758]
public static <TSource, TInner, TKey, TResult> Enumerable<TResult> groupJoin(
final Enumerable<TSource> outer, final Enumerable<TInner> inner,
final Function1<TSource, TKey> outerKeySelector,
final Function1<TInner, TKey> innerKeySelector,
final Function2<TSource, Enumerable<TInner>, TResult> resultSelector) {
return new AbstractEnumerable<TResult>() {
final Map<TKey, TSource> outerMap = outer.toMap(outerKeySelector);
final Lookup<TKey, TInner> innerLookup = inner.toLookup(innerKeySelector);
final Enumerator<Map.Entry<TKey, TSource>> entries =
Linq4j.enumerator(outerMap.entrySet());
public Enumerator<TResult> enumerator() {
return new Enumerator<TResult>() {
public TResult current() {
final Map.Entry<TKey, TSource> entry = entries.current();
final Enumerable<TInner> inners = innerLookup.get(entry.getKey());
return resultSelector.apply(entry.getValue(),
inners == null ? Linq4j.<TInner>emptyEnumerable() : inners);
}
public boolean moveNext() {
return entries.moveNext();
}
public void reset() {
entries.reset();
}
public void close() {
}
};
}
};
}