Responding to Ralf Schneider:
> public List<ZahlenPaar> mischeZahlenListen(List<BigInteger> listeInnen,
> List<BigInteger> listeAussen){
>
> // Darin eine Funktion zur Erstellung eins Objektes:
> BiFunction<BigInteger, BigInteger, ZahlenPaar> erstelleObjekt = (o,i) ->
> { ZahlenPaar zp = new ZahlenPaar(i, o);
> return zp;
> };
>
> List<ZahlenPaar> gemischtePaare = listeAussen.stream()
> .map(first -> {
> ZahlenPaar attribute = listeInnen.stream()
> .filter(second -> second != BigInteger.ZERO)
> .mapToObj(second -> { ZahlenPaar z =
> erstelleObjekt.apply(first, second);
> return z;
> });}).collect(Collectors.toList());
>
> return gemischtePaare;
> }
>
> Ich will zwei Listen (List<BigInteger> ) in einer geschachtelten Schleife
> so miteinander kombinieren, dass alle Elemente der einen Liste mit allen
> Elementen der anderen Liste paarig in je ein Objekt des Typs
> List<ZahlenPaar> umgewandelt werden.(1,2,3 und 4,5,6 sollen werden 1;4,
> 1;5, 1;6, 2;4 usw. bis zum neunten.)
Disclaimer: Mein Java ist etwas angestaubt, kann durchaus sein, dass es
besser geht...
Wenn Du verschachtelt über zwei Streams #map() aufrufst, erhältst Du
auch ein verschachteltes Stream<Stream<...>>. Du wirst den Kombinator
#flatMap() benötigen.
Vergleiche die Signaturen:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
<R> Stream<R> flatMap(
Function<? super T, ? extends Stream<? extends R>> mapper
);
https://www.baeldung.com/java-difference-map-and-flatmap
import java.math.*;
import java.util.*;
import java.util.stream.*;
static class Pair<A, B> {
// ...
}
private static <A, B> List<Pair<A, B>> combinations(
List<A> as, List<B> bs
) {
return
as.stream().flatMap(a ->
bs.stream().map(b ->
new Pair<A, B>(a, b)
)
)
.collect(Collectors.toList());
}
List<BigInteger> as =
Arrays.asList(1, 2, 3)
.stream()
.map(BigInteger::valueOf)
.collect(Collectors.toList());
List<BigInteger> bs =
Arrays.asList(4, 5, 6)
.stream()
.map(BigInteger::valueOf)
.collect(Collectors.toList());
System.out.println(combinations(as, bs));
// [(1, 4), (1, 5), (1, 6), (2, 4), ...]
Mit #mapMulti() kann man zum selben Ergebnis kommen, da sehe ich aber
konzeptuell überhaupt keinen Vorteil - #flatMap() ist generischer.
https://www.baeldung.com/java-mapmulti
Wenn Du eh schon Java machst und funktionale Aspekte einbringen willst,
fein. Wenn Du (auf der JVM) funktionale Programmierung lernen möchtest,
könnte Scala eine bessere Wahl sein. Nur zum Vergleich mal Scala-Versionen:
def combinations[A, B](as: List[A], bs: List[B]): List[(A, B)] =
as.flatMap(a => bs.map((a, _)))
def combinations[A, B](as: List[A], bs: List[B]): List[(A, B)] =
for { a <- as ; b <- bs } yield (a, b)