Optional dodanie wyniku do strumienia Stream

0

Mam tego typu problem

Optional<int[]> o = Jakaś funkcja zwracająca Optional<int[]>;. Funkcja ta jest wykonywania wielokrotnie i mam wpisać wyniki do Stream<int[]> allResults

0

Jeśli chcesz dodać element do istniejącego wcześniej streama allResult... to tak się nie da. Streamy nie są kolekcjami.
To co możesz uzyskać to połączenie dwóch streamów otrzymując nowy stream.

Stream<int[]> allResult = ... // istniejący stream

List<int[]> list = new ArrayList<>();
for (wywołane wielokrotnie) {
     jakasFunkcjaZwracajacaOptionala().ifPresent(list::add);
}
Stream<int[]> newStream = list.stream();

allResult = Stream.concat(allResult, newStream);
0

A możesz to wielokrotne wykonanie tejże funkcji jakoś opisać streamem? Wtedy mógłbyś poskładać to przez flatMap i odfiltrować te puste

0

Ok dzięki.
Jak mogę ten allResult wyrzucić w System.out.println. W tym przypadku nie działa
allTuples.forEach(System.out::println);

A możesz to wielokrotne wykonanie tejże funkcji jakoś opisać streamem? Wtedy mógłbyś poskładać to przez flatMap i odfiltrować te puste

Pomyślę nad tym. Muszę trochę poczytać

0

W ten sposób jakasFunkcjaZwracajacaOptionala().ifPresent(list::add); używając allResults.forEach(ints -> System.out.println(Arrays.toString(ints))); do wyświetlenia dostaję Arraylist z ostatnim elementem który był wpisany.

0

co znaczy "Funkcja ta jest wykonywania wielokrotnie"? W pętli czy jakoś inaczej?

0

Tak w pentli np. for powiedzmy 100 razy i chodzi o to jak to wpisać do ArrayList poprawnie. Ten sposób podany wyżej nie działa tak jak ma otrzymuję Array list ze 100 elementami ostatniego wpisanego elementu.

0

Pracując z innymi programistami (zakładam, że jeszcze nie pracujesz), prosząc o pomoc będziesz zmuszony nabyć umiejętność wyrażania swoich problemów w prosty sposób. Czytam i czytam Twoje posty i niestety ale nie potrafisz klarownie przedstawić swojego problemu. Popracuj nad tym.

Dodatkowo polecam zapoznanie się z debuggerem, który znacząco ułatwia pracę programiście, dzięki czemu zajrzysz "w głąb" kodu, który piszesz i wtedy będzie Ci łatwiej zrozumieć co tam się dzieje i co jest nie tak.

Powodzenia!

0

No cóż może to ty powinieneś popracować nad czytaniem ze zrozumieniem bo jak dla mnie problem jest opisany dość jasno i czytelnie.

Powodzenia.

0

Pokaż cały kod to będzie łatwiej

0

Ok więc już pisze o co mi chodzi na prostym przykładzie. Ten sam problem jest z kodem który podał piotrusha w drugim poście.


        List<int[]> list = new ArrayList<>();
        int i[] = {1,1};

        Optional<int[]> o = licz(i);
        list.add(o.get());
        System.out.println(o.get()[0] + "-- " + o.get()[1]);

        licz(i);
        list.add(o.get());
        System.out.println(o.get()[0] + "-- " + o.get()[1]);

        licz(i);
        list.add(o.get());
        System.out.println(o.get()[0] + "-- " + o.get()[1]);

        licz(i);
        list.add(o.get());
        System.out.println(o.get()[0] + "-- " + o.get()[1]);



        Stream<int[]> allResult = list.stream();
        allResult.forEach(ints -> System.out.println(Arrays.toString(ints)));

    }

        static Optional<int[]> licz(int[] z){

            for(int i=0; i< 2; i++) {
                 z[i] ++ ;
            }
            return Optional.of(z);
        }
}

Rezultat jest taki, że System out wypisują taki wynik:

3-- 3
4-- 4
5-- 5

Natomiast wypisanie listy daje zawsze ostatnią wartość:

[5, 5]
[5, 5]
[5, 5]

I to jest moje pytanie jak dodać do ArrayList<int[]> te wartości i co się dzieje, że to nie działa.

0

a mógłbyś słowami opisać co chcesz zrobić? Bo ten kod jest trochę... dziwny

Ale jeśli chcesz jakąś operacje wykonać n razy to możesz zrobić coś takiego:

        int x = 1;

        Stream
                .range(0,10)
                .map(i->licz(x))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .forEach(System.out::print);

0
maf2 napisał(a):

Rezultat jest taki, że System out wypisują taki wynik:

3-- 3
4-- 4
5-- 5

Natomiast wypisanie listy daje zawsze ostatnią wartość:

[5, 5]
[5, 5]
[5, 5]

I to jest moje pytanie jak dodać do ArrayList<int[]> te wartości i co się dzieje, że to nie działa.

Tutaj wszystko "działa".
Jakbyś włączył debugger - tak jak pisałem wcześniej to byś zauważył co się dzieje pod "maską".

Te system outy które używasz zaraz po każdym wywołaniu metody licz() printują cały czas ten sam obiekt .
Wyniki się różnią, ponieważ w końcowym streamie printujesz 4 razy ten sam obiekt, który już ma wartości 5 5 po Twoim ostatnim wywołaniu licz().

https://imgur.com/a/Yu1kxEE

0

Ok dzięki tylko jak dodawać to do tej listy prawidłowo ?

0
maf2 napisał(a):

Ok więc już pisze o co mi chodzi na prostym przykładzie. Ten sam problem jest z kodem który podał piotrusha w drugim poście.

    Optional<int[]> o = licz(i);
    list.add(o.get());

    licz(i);
    list.add(o.get());

Przy każdym wywołaniu licz() musisz przypisać to do nowego optionala.
Natomiast w metodzie licz() jednym ze sposobów jest zwracanie return Optional.of( Arrays.copyOf(z, z.length));

Oczywiście pomijam to, że nie jest to kod najwyższych lotów.

0

To już mnie to trochę naprowadziło.

A może idzie to jakoś inaczej rozwiązać lepiej. Chodzi mi głównie o to, że wyniki tego licz() muszę zamienić na Stream.?

0
maf2 napisał(a):

Chodzi mi głównie o to, że wyniki tego licz() muszę zamienić na Stream.?

Zależy jaki efekt chcesz osiągnąć

0

Taki, że wyniki licz() będę miał w strumieniu bo ten strumień(Stream) muszę przekazać do innej funkcji która jako parametr przyjmuje strumień(Stream).

Czyli chodzi o to, że wyniki licz() zwracają Optional<int[]> muszę je gdzieś zapisać np. ArrayList<int[]> i potem zamienić to na Stream.

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