Jak połączyć 2 streamy w 1?

0

Z 1 streamowanej listy chcę wziąć 1 element i dalej go przetwarzać:

public List<T> scrape(String textToSearchIn) {
		textToSearchIn = lineFinder.findLinesWithWantedTraitIn(text).stream()
				.findFirst()
				.orElse(textToSearchIn);
		return fragmentsFinder.findFragmentsWithWantedTraitIn(text).stream()
				.flatMap(fragment -> valueFinder.findTraitValuesIn(fragment).stream())
				.map(conveterStringToT)
				.filter(isTraitValueValidPredicate)
				.collect(Collectors.toList());
	}

czy jest jakiś w miarę rozsądnie nietrudny sposób by połączyć te streamy?


dodaję typy:
List<String> findLinesWithWantedTraitIn(String text);
List<String> findFragmentsWithWantedTraitIn(String text);
List<String> findTraitValuesIn(String textToSearchIn);
Function<String, Integer> conveterStringToT
Predicate<String> isTraitValueValidPredicate

1

Dzięki że pokazałeś co za typy tam masz, na pewno zgadniemy o które streamy ci chodzi i co chcesz łączysz...
No ale biorąc szklaną kulę, założmy że pytasz jak dwa Stream<String> połączyć w jeden, odpowiedź brzmi za pomocą flatMap :) Robisz Stream.of() tych streamów dostając Stream<Stream<String>> i flatMap zrobi z tego Stream<String>

Stream<String> x = Stream.of("ala", "ola");
Stream<String> y = Stream.of("ela", "ula");
Stream<String> result = Stream.of(x,y)
        .flatMap(Function.identity());
0
Shalom napisał(a):

Dzięki że pokazałeś co za typy tam masz, na pewno zgadniemy o które streamy ci chodzi i co chcesz łączysz...
No ale biorąc szklaną kulę, założmy że pytasz jak dwa Stream<String> połączyć w jeden, odpowiedź brzmi za pomocą flatMap :) Robisz Stream.of() tych streamów dostając Stream<Stream<String>> i flatMap zrobi z tego Stream<String>

Stream<String> x = Stream.of("ala", "ola");
Stream<String> y = Stream.of("ela", "ula");
Stream<String> result = Stream.of(x,y)
        .flatMap(Function.identity());

Sugerujesz tak, o?

	@Override
	public List<T> scrapeFrom(String text) {
		return Stream.of(linesFinder.findLinesWithWantedTraitIn(text).stream()
				.findFirst()
				.orElse(text)).flatMap(textLine -> fragmentsFinder.findFragmentsWithWantedTraitIn(textLine).stream())
				.flatMap(fragment -> valueFinder.findTraitValuesIn(fragment).stream())
				.map(conveterStringToT)
				.filter(isTraitValueValid)
				.collect(Collectors.toList());
	}

hm... wolałbum ten Stream.of jakoś dodać po .orElse(text)... czyli nie robić Stream.of("string") tylko "string".stream()

1

A ja bym wolał być astronautą. Zrobienie streamu ze stringa wymaga Stream.of() i tyle. Klasa String nie ma metody która by konwertowała tego stringa do streamu.
Niemniej ja bym jednak tego nie pisał w ten sposób bo jest mało czytelne. Zresztą nadal zupełnie nie rozumiem gdzie ty masz jakiś problem. Bo ten kod który teraz napisałeś ma niewielki sens. Zrobiłeś sobie jednoelementowy stream cholera wie po co.

Kod który miałeś na samym początku jest dużo lepszy i czytelniejszy. Chyba ze koniecznie chcesz z tego zrobić jedną instrukcje, ale to chyba sztuka dla sztuki tylko.

1

Nie potrzebujesz flatMap().

Stream<Integer> stream1 = Stream.of(1, 3, 5);
Stream<Integer> stream2 = Stream.of(2, 4, 6);
 
Stream<Integer> resultingStream = Stream.concat(stream1, stream2);
 ``

1 użytkowników online, w tym zalogowanych: 0, gości: 1