default <U> Seq<Tuple2<T, U>> leftOuterJoin(Seq<? extends U> other, BiPredicate<? super T, ? super U> predicate) {

        // This algorithm has substantial complexity for large argument streams!
        SeqBuffer<? extends U> buffer = SeqBuffer.of(other);

        return flatMap(t -> buffer.seq()
                           .filter(u -> predicate.test(t, u))
                           .onEmpty(null)
                           .map(u -> Tuple.<T, U>tuple(t, u)))
              .onClose(other::close);
    }
Left outer join 2 streams into one.
<p>
<pre><code>
// (tuple(1, 1), tuple(2, 2), tuple(3, null))
Seq.of(1, 2, 3).leftOuterJoin(Seq.of(1, 2), (t, u) -> Objects.equals(t, u))
</code></pre>
jOOL/src/main/java/org/jooq/lambda/Seq.java