Wykonaj metodę jeżeli jej argument nie jest null

0

Czy istnieje jakiś elegancki sposób by wywoływać metodę w strumieniu tylko wtedy gdy jej parametr nie jest null?

list
.stream()
.filter(doSomething(arg)) // wykonaj tylko wtedy gdy arg =! null
.collect(collectors.tolist())
3

dodaj tam po stream:

.filter(arg -> arg != null)
0

Szybsze będzie

if(arg == null){
  return Collections.emptyList()
}

// streamowanie....

3
aolo23 napisał(a):

Szybsze będzie
if(arg == null){
return Collections.emptyList()
}
// streamowanie....

O ile szybsze?

3
aolo23 napisał(a):

Szybsze będzie
if(arg == null){
return Collections.emptyList()
}
// streamowanie....

Może i szybsze niewiele, ale pewnie też niepoprawne. arg pochodzą z Listy, więc jak będziesz miał 5 nulli i 1 not null, to zwrócisz pustą kolekcję, a nie o to (chyba) autorowi chodzi.

  .filter(Objects::notNull)
  .map(Klazz::doSomething)
  .collect...
0
tefu napisał(a):

Czy istnieje jakiś elegancki sposób by wywoływać metodę w strumieniu tylko wtedy gdy jej parametr nie jest null?

list
.stream()
.filter(doSomething(arg)) // wykonaj tylko wtedy gdy arg =! null
.collect(collectors.tolist())

Zależy co dokładnie chcesz zrobić.

Co znaczy "nie wołać metody"? Znaczy że chcesz usunąć element, czy chcesz go nie poddawać filtrowaniu?

  • Jeśli chcesz go usunąć, to dodaj .filter() tak jak pisali @Escanor16 i @yarel.
  • Jeśli nie chcesz wołać metody filtrującej, ale mimo to nie usuwać elementu, to wtedy:
    list
      .stream()
      .filter(arg => arg == null || doSomething(arg))
      .collect(collectors.tolist());
    
1
lista.stream()
     .peek(args -> {
        if (args != null) {
          doSomething();
        }
      })
     .collect(Collectors.toList());

Pewnie warto się tutaj zastanowić czemu w ogóle jakiś element listy może być nullem?
Być może nie powinniśmy do tego dopuścić wcześniej w kodzie?
Ewentualnie to co napisał Riddle: czy na pewno chcesz aby Twój kod pozostawiał te nulle i je propagował dalej narażając się na NPE? Zależy od use case'u ale raczej da się to zamodelować inaczej/lepiej.

Offtop: nie mogę wyjść z podziwu, że w czasach gdy prompt wystarczy do wygenerowania animacji której kiedyś nie powstydził by się Pixar ludzie wciąż zadają tego typu pytania (no offense) 😃

0
[RequiredNickname napisał(a)]

Offtop: nie mogę wyjść z podziwu, że w czasach gdy prompt wystarczy do wygenerowania animacji której kiedyś nie powstydził by się Pixar ludzie wciąż zadają tego typu pytania (no offense) 😃

Co ma jedno do drugiego?

Każdy się kiedyś uczy.

0
RequiredNickname napisał(a):
lista.stream()
     .filter(Objects::nonNull)
     .collect(Collectors.toList());

Pewnie warto się tutaj zastanowić czemu w ogóle jakiś element listy może być nullem?

  1. Panie kolego, jakbym miał tutaj wyjaśniać wszystkie zależności to by zeszło mi na to pół dnia.

Być może nie powinniśmy do tego dopuścić wcześniej w kodzie?

  1. Być może. Patrz wyżej.

Ewentualnie to co napisał Riddle: czy na pewno chcesz aby Twój kod pozostawiał te nulle i je propagował dalej narażając się na NPE? Zależy od use case'u ale raczej da się to zamodelować inaczej/lepiej.

  1. Mam sytuację gdzie muszę wybrać między złem a złem. Poza tym patrz punkt 1.

Offtop: nie mogę wyjść z podziwu, że w czasach gdy prompt wystarczy do wygenerowania animacji której kiedyś nie powstydził by się Pixar ludzie wciąż zadają tego typu pytania (no offense) 😃

  1. A ja nie mogę się nadziwić, że ludzie nie dorośli do tego by milczeć gdy mają coś głupiego do powiedzenia.
0
Riddle napisał(a):
tefu napisał(a):

Czy istnieje jakiś elegancki sposób by wywoływać metodę w strumieniu tylko wtedy gdy jej parametr nie jest null?

list
.stream()
.filter(doSomething(arg)) // wykonaj tylko wtedy gdy arg =! null
.collect(collectors.tolist())

Zależy co dokładnie chcesz zrobić.

Co znaczy "nie wołać metody"? Znaczy że chcesz usunąć element, czy chcesz go nie poddawać filtrowaniu?

Miałem na myśli, jeśli argument jest nullem to nie rób nic, pomiń metodę.

  • Jeśli chcesz go usunąć, to dodaj .filter() tak jak pisali @Escanor16 i @yarel.

To mi się nie sprawdziło.

  • Jeśli nie chcesz wołać metody filtrującej, ale mimo to nie usuwać elementu, to wtedy:

To raczej będzie ten przypadek.

list
  .stream()
  .filter(arg => arg == null || doSomething(arg))
  .collect(collectors.tolist());

Dzięki ;-)

0
Riddle napisał(a):
[RequiredNickname napisał(a)]

Offtop: nie mogę wyjść z podziwu, że w czasach gdy prompt wystarczy do wygenerowania animacji której kiedyś nie powstydził by się Pixar ludzie wciąż zadają tego typu pytania (no offense) 😃

Co ma jedno do drugiego?

Każdy się kiedyś uczy.

Moim zdaniem ma tyle wspólnego, że warto najpierw wiedzieć "jak się uczyć" a potem się uczyć.
Gdybyś chciał nauczyć się grać na pianinie to byś poszukał kanały na YT/nauczyciela czy bezmyślnie uderzał w klawisze mając nadzieję, że jakoś to zabrzmi?
Koniec offtopa, sorry 😉

@tefu
Widzisz, kiedyś dojdziesz do tego, że kontekst jest turbo istotny i często to właśnie on decyduje o finalnym rozwiązaniu oraz do tego, że jeżeli piszesz kod i czujesz w kościach, że śmierdzi (bo np. nie da sięgo sensownie przetestować unitowo itp) to masz sygnał, że problem może leżeć gdzieś indziej i czasem warto poprawić 😉

Bynajmniej nie oczekuję, że będziesz się tu rozpisywał, dostałeś odpowiedź na pytanie, dostałeś sugestię którą albo przemyślisz albo nie - twoja sprawa co robisz z feedbackiem 🙂

list
  .stream()
  .filter(arg => arg == null || doSomething(arg))
  .collect(collectors.tolist());

Filter nie służy do wołania metod, jesli już to peek().
https://www.baeldung.com/java-streams

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