Uzyskanie przecięcia dwóch strumieni lub sprawdzenie, czy ich przecięcie jest puste, czy też nie, jest generalnie niemożliwe w Javie, ponieważ strumienie można użyć tylko raz, a rozwiązanie ogólne ma złożoność .Ustalanie, czy przecięcie strumienia nie jest puste
Jeśli nie wiemy nic na temat charakteru bazowego dostawcy wiedzieć, możemy uciec z co najwyżej jednym strumieniu i jednej kolekcji:
<T> boolean intersects(final Stream<T> c1, final Collection<T> c2) {
return c1.filter(c2::contains).findAny().isPresent();
}
Mimo to, co jeśli obie nasi dostawcy reprezentują zamówionej kolekcje posortowane przy użyciu tego samego komparatora (w najprostszym przypadku, dwa TreeSet
s z Comparable
s)? W takim przypadku rozwiązanie będzie miało złożoność liniową liniową (lub, bardziej precyzyjnie, , patrz odpowiedź this).
Teraz pytanie wyżej liniowy rozwiązanie może być realizowane za pomocą tylko Strumień API (to jest za pomocą dwóch strumieni jako wejście.).?
Czy pytasz, czy możesz wdrożyć rozwiązanie liniowe, jeśli dane w strumieniach są uporządkowane? –
Rozwiązania iteracyjne i strumienie nie pasują do siebie, więc najlepszą rzeczą, jaką możesz zrobić, jest wywołanie 'iterator()' na strumieniach i kontynuowanie. – Holger
@JimMischel Tak, dokładnie – Bass