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
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);
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
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ć
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.
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!
No cóż może to ty powinieneś popracować nad czytaniem ze zrozumieniem bo jak dla mnie problem jest opisany dość jasno i czytelnie.
Powodzenia.
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.
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);
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().
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.
maf2 napisał(a):
Chodzi mi głównie o to, że wyniki tego licz() muszę zamienić na Stream.?
Zależy jaki efekt chcesz osiągnąć
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.