1- package com .github .lokic .javaplus ;
1+ package com .github .lokic .javaplus . join ;
22
3+ import com .github .lokic .javaplus .NullData ;
34import com .github .lokic .javaplus .tuple .Tuple ;
45import com .github .lokic .javaplus .tuple .Tuple2 ;
56
1213
1314public class Join {
1415
16+ public static <T > JoinStream <T > stream (Stream <T > stream ) {
17+ return new JoinStream <>(stream );
18+ }
1519
1620 public static <T1 , T2 > JoinType <T1 , T2 > innerJoin (Stream <T1 > left , Stream <T2 > right ) {
1721 return new JoinType <>(left , right , t -> t .getT1 () != null && t .getT2 () != null );
@@ -29,68 +33,66 @@ public static <T1, T2> JoinType<T1, T2> fullOuterJoin(Stream<T1> left, Stream<T2
2933 return new JoinType <>(left , right , t -> !(t .getT1 () == null && t .getT2 () == null ));
3034 }
3135
32- public static <T1 , T2 > JoinType <T1 , T2 > innerJoin (Collection <T1 > left , Collection <T2 > right ) {
33- return innerJoin (left .stream (), right .stream ());
34- }
35-
36- public static <T1 , T2 > JoinType <T1 , T2 > leftOuterJoin (Collection <T1 > left , Collection <T2 > right ) {
37- return leftOuterJoin (left .stream (), right .stream ());
38- }
39-
40- public static <T1 , T2 > JoinType <T1 , T2 > rightOuterJoin (Collection <T1 > left , Collection <T2 > right ) {
41- return rightOuterJoin (left .stream (), right .stream ());
42- }
43-
44- public static <T1 , T2 > JoinType <T1 , T2 > fullOuterJoin (Collection <T1 > left , Collection <T2 > right ) {
45- return fullOuterJoin (left .stream (), right .stream ());
46- }
4736
48- public static class JoinStream <T1 , T2 > {
37+ public static class JoinStream <T > {
38+ private final Stream <T > left ;
4939
50- private final Stream <Tuple2 <T1 , T2 >> left ;
51-
52- private JoinStream (Stream <Tuple2 <T1 , T2 >> stream ) {
53- this .left = stream ;
40+ private JoinStream (Stream <T > left ) {
41+ this .left = left ;
5442 }
5543
56- public Stream <Tuple2 < T1 , T2 > > stream () {
44+ public Stream <T > stream () {
5745 return left ;
5846 }
5947
60- public <R > Stream <R > flattenStream (Function <? super Tuple2 < T1 , T2 > , ? extends R > mapper ) {
48+ public <R > Stream <R > flattenStream (Function <? super T , ? extends R > mapper ) {
6149 return left .map (mapper );
6250 }
6351
64- public <T3 > JoinType <Tuple2 < T1 , T2 > , T3 > innerJoin (Stream <T3 > right ) {
52+ public <T3 > JoinType <T , T3 > innerJoin (Stream <T3 > right ) {
6553 return Join .innerJoin (left , right );
6654 }
6755
68- public <T3 > JoinType <Tuple2 < T1 , T2 > , T3 > leftOuterJoin (Stream <T3 > right ) {
56+ public <T3 > JoinType <T , T3 > leftOuterJoin (Stream <T3 > right ) {
6957 return Join .leftOuterJoin (left , right );
7058 }
7159
72- public <T3 > JoinType <Tuple2 < T1 , T2 > , T3 > rightOuterJoin (Stream <T3 > right ) {
60+ public <T3 > JoinType <T , T3 > rightOuterJoin (Stream <T3 > right ) {
7361 return Join .rightOuterJoin (left , right );
7462 }
7563
76- public <T3 > JoinType <Tuple2 < T1 , T2 > , T3 > fullOuterJoin (Stream <T3 > right ) {
64+ public <T3 > JoinType <T , T3 > fullOuterJoin (Stream <T3 > right ) {
7765 return Join .fullOuterJoin (left , right );
7866 }
7967
80- public <T3 > JoinType <Tuple2 <T1 , T2 >, T3 > innerJoin (Collection <T3 > right ) {
81- return innerJoin (right .stream ());
68+ public <U , K , R > JoinStream <R > innerJoin (Stream <U > right , JoinOn <T , U , K , R > on ) {
69+ Stream <R > stream = innerJoin (right )
70+ .on (on .getLeftKey (), on .getRightKey ())
71+ .flattenStream (on .getFlatten ());
72+ return new JoinStream <>(stream );
8273 }
8374
84- public <T3 > JoinType <Tuple2 <T1 , T2 >, T3 > leftOuterJoin (Collection <T3 > right ) {
85- return leftOuterJoin (right .stream ());
75+ public <U , K , R > JoinStream <R > leftOuterJoin (Stream <U > right , JoinOn <T , U , K , R > on ) {
76+ Stream <R > stream = leftOuterJoin (right )
77+ .on (on .getLeftKey (), on .getRightKey ())
78+ .flattenStream (on .getFlatten ());
79+ return new JoinStream <>(stream );
8680 }
8781
88- public <T3 > JoinType <Tuple2 <T1 , T2 >, T3 > rightOuterJoin (Collection <T3 > right ) {
89- return rightOuterJoin (right .stream ());
82+
83+ public <U , K , R > JoinStream <R > rightOuterJoin (Stream <U > right , JoinOn <T , U , K , R > on ) {
84+ Stream <R > stream = rightOuterJoin (right )
85+ .on (on .getLeftKey (), on .getRightKey ())
86+ .flattenStream (on .getFlatten ());
87+ return new JoinStream <>(stream );
9088 }
9189
92- public <T3 > JoinType <Tuple2 <T1 , T2 >, T3 > fullOuterJoin (Collection <T3 > right ) {
93- return fullOuterJoin (right .stream ());
90+
91+ public <U , K , R > JoinStream <R > fullOuterJoin (Stream <U > right , JoinOn <T , U , K , R > on ) {
92+ Stream <R > stream = fullOuterJoin (right )
93+ .on (on .getLeftKey (), on .getRightKey ())
94+ .flattenStream (on .getFlatten ());
95+ return new JoinStream <>(stream );
9496 }
9597 }
9698
@@ -106,7 +108,7 @@ private JoinType(Stream<T1> left, Stream<T2> right, Predicate<Tuple2<T1, T2>> jo
106108 this .joinMatcher = joinMatcher ;
107109 }
108110
109- public <K > JoinStream <T1 , T2 > on (Function <T1 , K > leftKey , Function <T2 , K > rightKey ) {
111+ public <K > JoinStream <Tuple2 < T1 , T2 > > on (Function <T1 , K > leftKey , Function <T2 , K > rightKey ) {
110112 Stream <Tuple2 <T1 , T2 >> stream = Stream .concat (leftWrappedStream , rightWrappedStream )
111113 .collect (Collectors .toMap (
112114 t -> matchKey (t , leftKey , rightKey ),
0 commit comments