Jak mogę zaimplementować funkcję wykorzystującą Javę 8 do pobrania pewnej liczby strumieni i utworzyć strumień, w którym każdy element jest listą składającą się z jednego członka kartezjańskiego produktu strumieni?Strumień iloczynu kartezjańskiego z innych strumieni, każdy element jako lista?
Przyjrzałem się this question - to pytanie używa agregatora, który jest BinaryOperator
(biorąc dwa przedmioty podobnego typu i produkując przedmiot tego samego typu). Chciałbym, aby elementy w wyniku końcowym były raczej typami elementów w strumieniach wejściowych.
Konkretnie, zakładając mój żądaną funkcję nazywa product
, co następuje:
Stream<List<String>> result =
product(
Stream.of("A", "B", "C", "D"),
Stream.of("I", "J", "K),
Stream.of("Y", "Z")
);
result.forEach(System.out::println);
należy wydrukować:
[A, I, Y]
[A, I, Z]
[A, J, Y]
[A, J, Z]
[A, K, Y]
[A, K, Z]
[B, I, Y]
...
[D, K, Y]
[D, K, Z]
Idealnie, chciałbym za to operacja być tak leniwy, jak to możliwe. Na przykład, jeśli strumienie wejściowe są produkowane przez Stream.generate()
, byłoby świetnie, gdyby dostawcy tych strumieni nie byli uruchamiani, dopóki nie będą absolutnie potrzebni.
Czy to pomoże? http://stackoverflow.com/a/40202722/5629413 –
Strumień może zostać zużyty tylko jeden raz, więc jeśli podasz 'product()' tylko trzy strumienie jednorazowego użytku, to będzie musiał przechowywać wszystkie wartości dwóch z nich, w takim przypadku możesz lepiej dać trzy obiekty "Iterable", aby zapobiec duplikowaniu danych wejściowych. – Andreas
To dość skomplikowane. W JDK nie ma nic, co by to wesprzeć. Będziesz musiał napisać kod ... – Bohemian