Kombinieren von 2 Streams

Yaslaw

alter Rempler
Moderator
Ich habe 2 Streams. Einer beinhaltet eine Liste mit LocalDate, der andere eine Liste mit LocalTime.
Jetzt sollten diese Streams so kombiniert werden, dass ich nachher eine grössere Liste habe, mit allen Date-Time Kombinationen.

So habe ich es jetzt (noch ungetestet). EIgentlch hätte ich diese Kombination gerne mit Stream gelöst und nicht mit for().
Java:
                //Stream mit den letzten 8 Tagen erstellen (inkl. Heute)
                Stream<LocalDate> dateLs = IntStream
                        .range(0, 8)
                        .mapToObj(i -> Integer.valueOf(i))
                        .map(d -> LocalDate.now().minusDays(d));
               
                //Stream der Uhrzeiten auslesen
                Stream<LocalTime> ts = to.getStartAtTs().stream();
               
                //Neue Liste für die Datum-Zeit Kombinationen
                List<LocalDateTime> dts = new ArrayList<LocalDateTime>();
                //Alle Tage durchgehen
                for(LocalDate d: dateLs.collect(Collectors.toList())) {
                    //Alle Uhrzeiten mit dem Tag kombinieren und in die Liste eintragen
                    dts.addAll(
                            ts.map(t -> t.atDate(d))
                            .collect(Collectors.toList())
                    );
                }
 

Yaslaw

alter Rempler
Moderator
Danke für den HInweis. Mir hat der Begriff (kartesisches Produkt) zum suchen gefehlt.
Spannende Sache. Aber wenn ich die Lösungen anschaue, sind sie nicht gerade einfacher :). Ich werde sie aber mal genauer analysieren. Sieht spannend aus.
Ev. bleibe ich auch bei der List-Lösung, die verstehe ich auch in einem Jahr noch und performant muss es nicht sein, läuft in einem Nightly-Job.
 

Yaslaw

alter Rempler
Moderator
Nicht ganz jene Lösung, da die Anforderung doch ein weneig anders ist als bei einem normalen Kartesischen Produkt.
Ich werde sie leider erst morgen testen können. Die Einzelschritte werde noch zuasmmengesetzt. Aber zum Debuggen und aufbauen sind EInzelschritte angenehmer
Java:
Stream<LocalDate> dateLs = ...;
Stream<LocalTime> ts = ....;
//Mappe den Datum-Stream in ein Stream von Streams mit DateTime
Stream<Stream<LocalDateTime>> tt =  dateLs.map(d -> ts.map(t -> t.atDate(d)));
//Füge die Unterstreams zusammen
Stream<LocalDateTime> ttt = tt.flatMap(Function.identity());
 
Zuletzt bearbeitet: