public <U, E extends Exception> List<Pair<T, U>> innerJoin(final Collection<U> b, final Try.BiPredicate<? super T, ? super U, E> predicate) throws E {
        final List<Pair<T, U>> result = new ArrayList<>(N.min(9, size(), N.size(b)));

        if (N.isNullOrEmpty(coll) || N.isNullOrEmpty(b)) {
            return result;
        }

        for (T left : coll) {
            for (U right : b) {
                if (predicate.test(left, right)) {
                    result.add(Pair.of(left, right));
                }
            }
        }

        return result;
    }
public < U , E extends Exception > List < Pair < T , U > > innerJoin ( final Collection < U > b , final Try . BiPredicate < ? super T , ? super U , E > predicate ) throws E { final List < Pair < T , U > > result = new ArrayList < > ( N . min ( 9 , size ( ) , N . size ( b ) ) ) ; if ( N . isNullOrEmpty ( coll ) || N . isNullOrEmpty ( b ) ) { return result ; } for ( T left : coll ) { for ( U right : b ) { if ( predicate . test ( left , right ) ) { result . add ( Pair . of ( left , right ) ) ; } } } return result ; }
The time complexity is <i>O(n * m)</i> : <i>n</i> is the size of this <code>Seq</code> and <i>m</i> is the size of specified collection <code>b</code>.

@param b
@param predicate
@return
@see <a href="http://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-and-ful