Zatrzymanie strumienia po wykonaniu instrukcji if lub else

0
    testSet.stream().forEach(m -> {
            if(m.getAnimal.equals(dog)){
                m.setAge(m.getAge() + 1);  
            } else {
                Cat cat = new Cat();
            }
        });

Mam taki strumień i chciałbym, aby po od razu po wykonaniu instrukcji if lub else stream się zatrzymywał. Teraz aktualnie mam tak, że jeżeli stream wejdzie w else to tworzy się tyle obiektów cat ile jest elementów w testSet., z if analogicznie. Jest to jakoś wykonalne ?

1

Przede wszystkim używanie .stream.forEach jest tu kompletnie bez sensu.

0

Znaczy, chcesz wykonać ta instrukcje raz? Wysterczy wywołać getAny

0

j.w., ale o coś takiego ci chodzi? Idea ta sama, tylko tutaj Stringi.

List.of("a","b", "c")
                .stream()
                .findFirst()
                .map( x -> {
                    if ( x.length() == 0 ){
                        return "Do something...";
                    } else{
                        return "Do something else...";
                    }
                });
0
shagrin napisał(a):

Przede wszystkim używanie .stream.forEach jest tu kompletnie bez sensu.

Dlaczego ? I czego użyć w zamian ?

AndrzejAd, przetestuję jak wrócę do domu i dam znać.

0
wartek01 napisał(a):

Znaczy, chcesz wykonać ta instrukcje raz? Wysterczy wywołać getAny

Tego ifa chce przeprowadzić dla wszystkich elementów setu i jeżeli dla wszystkich zwróci false, to chce wywołać jeden raz to co jest pod else. Chyba źle się wyraziłem na początku

0
if ( List.of("a","b", "c")
                .stream()
                .allMatch( (x) -> ! (x.length() == 0 ))){
            System.out.println("Wszystkie mają rozmiar inny od 0.");
        }

Analogicznie możesz sobie zrobić.

0

Okej, a jeżeli dla któregoś z nich zwróci wartość true, to jak mogę zmodyfikować x ?

0

Wklepałem sobie teraz tą instrukcje i to nie o to chodzi. Bo to sprawdza czy wszystkie elementy mają rozmiar różny od 0, a ja chcę sprawdzać, nie dla wszystkich łącznie, tylko dla każdego po kolei i jeżeli dla któregoś x da mi false, to chcę ten x zmodyfikować i przerwać strumień.

1

see takeWhile
(od javy 9).

0

A wyżej napisałeś "Tego ifa chce przeprowadzić dla wszystkich elementów setu i jeżeli dla wszystkich zwróci false, to chce wywołać jeden raz to co jest pod else" ... weź się zdecyduj.

Bo sam się w tym trochę gubię, postaram się zebrać to w całość: Każdy element setu sprawdzamy if-em, jeżeli dla któregoś zwróci true - modyfikujemy ten element i na tym koniec. Jeżeli dla wszystkich zwróci false - tworzymy inny, zupełnie nowy obiekt, niezwiązany z tym co jest w secie, tak jak napisałem w pierwszym poście.

0

W skrócie - możesz użyć anyMatch który zwróci boolean. Potem na podstawie tego booleana robisz coś lub nie

0

No to doszedłem do czegoś takiego:

   if (Arrays.asList("a", "b", "c", "d", "e")
                .stream()
                .anyMatch((x) ->  (x.equals("d")))) {
            //i jak w tym miejscu odwołać się do (x), które zwraca true żeby je zmodyfikować ?
        }
0

anyMatch() zwraca boolean i zamyka stream, ta metoda ci powie tylko czy któryś element spełnia predicate. Nie zwróci ci go. Musisz to koniecznie robić na Streamach?

Jeżeli na streamach nie da się tego osiągnąć to w sumie nie. Chciałem po prostu żeby to wyglądało w miarę schludnie i elegancko,a nie pisane przez kogoś kto wczoraj Javę odkrył. Wykombinowałem coś takiego, ale nie wiem czy to nie jest spaghetti code:

List<String> lista = new ArrayList<>();
        lista.add("a");
        lista.add("b");
        lista.add("c");
        lista.add("d");

        lista.stream().map(m -> {
            if(m.equals("c")){
                m = "cc";
            }
            return m;
        }).collect(Collectors.toList()).stream().forEach(System.out::println);

W konsoli:

a
b
cc
d
0

Sorry, pomyłka. Sugeruję wspomnieny już filter + findAny/findFirst.

0

Ale findAny/findFirst mi zwróci tylko Optionala, element w secie pozostanie niezmodyfikowany..

0

Te twoje rozwiązanie jest trochę bez sensu, zresztą nie robi to co chciałeś (bazując na tym poście), bo:

  • przechodzi przez wszystkie obiekty, a nie kończy się po jakimś true
  • po samych falsach, nie zwróci ci "nowego" obiektu, tak jak chciałeś

Jak chcesz to zrobić tylko na streamach to rozwiązania szukałbym w jakichś vavrach czy innych bibliotekach.

0

No wiem właśnie. Dobra, będę kombinował dalej.

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