Ну, это кажется не простым, но это возможно.
Сначала некоторая подготовка - я использую Project Lombok , чтобы генерировать геттеры / сеттеры и конструкторы, используя простые аннотации, просто создайте Mavenспроектируйте и добавьте в него эту зависимость:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
Ниже приведены определения наших классов и таблиц с данными:
@AllArgsConstructor @Getter
public static class Person {
private String key, name;
}
@AllArgsConstructor @Getter
public static class Thing {
private String key, item;
}
@AllArgsConstructor @Getter
public static class PersonToThing {
private String personKey, thingKey, has;
}
static Collection<Person> tablePerson = Arrays.asList(
new Person("11", "Senor"),
new Person("22", "Tom"));
static Collection<Thing> tableThing = Arrays.asList(
new Thing("AA", "Moustache"),
new Thing("BB", "Sombrero"),
new Thing("CC", "HotSauce"),
new Thing("XX", "Not important")
);
static Collection<PersonToThing> tablePerson2Thing = Arrays.asList(
new PersonToThing("11", "AA","Y"),
new PersonToThing("11", "BB","N"),
new PersonToThing("11", "CC","Y"));
Теперь фрагмент кода, который выполняетобъединение этих трех коллекций.
@AllArgsConstructor(staticName = "of") @Getter
public static class Tuple<V1,V2>{
private V1 v1;
private V2 v2;
}
@AllArgsConstructor(staticName = "of") @Getter
public static class Triple<V1,V2,V3>{
private V1 v1;
private V2 v2;
private V3 v3;
}
public static void main(String[] args) {
tablePerson.stream()
// WHERE Person.NAME="Senor";
.filter(x->x.getName()=="Senor")
// INNER JOIN PersonToThing
.flatMap( p -> tablePerson2Thing.stream()
.map(p2t-> Tuple.of(p,p2t))
// ON Person.KEY=PersonToThing.PERSON_PKEY
.filter(t->t.getV1().getKey()==t.getV2().getPersonKey())
)
// INNER JOIN Thing
.flatMap( p2t-> tableThing.stream()
.map(t-> Triple.of(p2t.getV1(),p2t.getV2(),t))
// ON Thing.KEY=PersonToThing.THING_KEY
.filter(t->t.getV2().getThingKey()==t.getV3().getKey())
)
// SELECT Person.NAME, Thing.ITEM, PersonToThing.HAS
.forEach(x->System.out.println(x.getV1().getName()+ " / " + x.getV3().getItem() + " / " + x.getV2().getHas()));
}
и результат:
Senor / Moustache / Y
Senor / Sombrero / N
Senor / HotSauce / Y