static <T1, T2, T3> Seq<Tuple3<T1, T2, T3>> crossJoin(Seq<? extends T1> s1, Seq<? extends T2> s2, Seq<? extends T3> s3) {

        // [#323] Some explicit type variable bindings required because of compiler regressions in JDK 9
        List<Tuple2<T2, T3>> list = Seq.<T2, T3>crossJoin(s2, s3).toList();
        return s1.flatMap(v1 -> seq(list).map(t -> tuple(v1, t.v1, t.v2)))
                 .onClose(SeqUtils.closeAll(s2, s3));
    }
Cross join 3 streams into one.
<p>
<pre><code>
// (tuple(1, "a"), tuple(1, "b"), tuple(2, "a"), tuple(2, "b"))
Seq.of(1, 2).crossJoin(Seq.of("a", "b"))
</code></pre>
jOOL/src/main/java/org/jooq/lambda/Seq.java