Jak połączyć 2 streamy w 1?

Odpowiedz Nowy wątek
2019-03-02 20:38
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

edytowany 4x, ostatnio: Julian_, 2019-03-02 21:11

Pozostało 580 znaków

2019-03-02 20:40
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());

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 5x, ostatnio: Shalom, 2019-03-02 20:46
dodałem typów, znaczy się typy - Julian_ 2019-03-02 21:10

Pozostało 580 znaków

2019-03-02 21:15
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()

Pozostało 580 znaków

2019-03-02 21:44
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.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 2x, ostatnio: Shalom, 2019-03-02 21:46
no widzę właśnie, że wcześniej było lepiej... - Julian_ 2019-03-02 21:46

Pozostało 580 znaków

2019-03-02 23:55
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);
 ``

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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