Automatisierte Ausgabe (Schleife, If-Abfrage?)

belshop1

Mitglied
Hallo! Ich bin komplett neu in Java und hätte mal eine Frage. Wahrscheinlich wird man diese schon hier im Forum oder auf Google finden, nur leider weiß ich nicht genau wonach ich spezifisch suchen soll. Nun zur Frage:

Ich möchte aus einer mir unbekannt langen Liste String-Werte zurück geben lassen. Pro Anfrage zum Server kann der mir immer maximal 100 Werte zurückgeben. Bei der darauffolgenden Anfrage muss ich mir erst einen Cursor von einer Pagination ausgeben lassen und diese dann in die Anfrage einbinden. Manuell ist das kein Problem. Da ich aber leider nicht die Länge der Liste kenne, müsste ich mir eine Art "Automation" schreiben. Ich hab das ganze schon über Schleifen versucht, dass hat aber nicht so richtig funktioniert :-D .

Wie gesagt, entschuldigt wenns das ganze schon zig mal hier im Forum gibt, ich hab einfach nichts passendes gefunden.

MfG Belshop1
 
Beste Antwort
Ich wollte genau diese Twitch4j Version wissen. Und ich sehe gerade, dass ich nicht gut genug geschaut habe - bei dem getFollowers(...) ist ja noch ein .execute() dran.

Deine Logik ist einfach nur Müll (Sorry für die Harten Worte!)

Die Logik ist doch ganz einfach so in der Art:
Java:
String pagination;
do {
    FollowList resultList = twitchClient.getHelix().getFollowers(..., pagination, 100).execute();
    // Mach etwas mit den Usern ...
    pagination = resultList.getPagination().getCursor();
} while (pagination != null);

Das wäre eine Möglichkeit zum Beispiel, wirklich alle Follower zu bekommen:
Java:
String pagination;
List<Follow> allFollower = new ArrayList<>();
do {
    FollowList resultList =...

KonradN

Super-Moderator
Mitarbeiter
Da bräuchte man dann deutlich mehr Details. Aber das Vorgehen ist durchaus normal und üblich.

Die erste wichtige Frage ist immer: Was ist denn von der Schnittstelle vorgesehen? Ich kenne da zwei verschiedene Ansätze:
a) Es gibt immer eine Information bezüglich der Daten. Du bekommst also eine Informationen, wie viele Datensätze oder Seiten abgerufen werden können.
b) Es kann auch sein, dass diese Information nicht gegeben wurde. Dann wäre eine Schleife zu schreiben, die abbricht, wenn entweder nicht die volle Satzgröße geliefert wird (Du willst 100 Datensätze aber du bekommst nur weniger) oder eben es kommen keine Datensätze mehr.

Wenn Du uns da mehr Details gibst, dann können wir Dir auch etwas helfen.
 

belshop1

Mitglied
Von der Schnittstelle ist vorgesehen, dass maximal 100 Datensätze pro Anfrage ausgegeben werden können. So wie ich das verstanden habe bekomme ich keine Information wie viele Daten abgerufen werden können/ Daten vorhanden sind. Ich danke also, dass b) die Sinnvollere Lösung wäre.

Vielleicht helfen die 2 Zeilen Beispiel Code:

list.getData(Auth-Daten, Data_from_ID, Data_to_ID(null, da ich keine Datensätze abgleichen möchte, sondern nur Abfrage),null (Pagination,weil ich bei Datensatz 1 starten möchte),100(maximaler Datensatz))

- Das wäre der Code den ich als erstes Ausführen möchte. Pagination-null wird dann durch die Ausgabe des zweiten Codes ersetzt um bei 101 zu starten. Das müsste fortlaufend passieren.

list.getPagination.getCursor



Ich hoffe das macht es etwas übersichtlicher. MfG Belshop1
 

KonradN

Super-Moderator
Mitarbeiter
Also der Code sagt mir so gar nichts. Wenn es da ein getPagination() Aufruf gibt, dann ist die Frage, was da zurück kommt. Das muss ja dokumentiert sein. Ich würde vermuten, dass man da einiges sehen kann.

Und ohne wirkliche Details kann man nun einmal auch nichts genaues sagen.
 

Neumi5694

Top Contributor
Kleiner Tip.
Auch im Forum bietet es sich an, Methoden nach den Vorgaben zu dokumentieren.
Mal von der Sinnhaftigkeit der Texte abgesehen, wäre das für alle, die's lesen, viell leichter verständlich
Java:
/**
 * Irgendeine Klasse, die was mit einer Liste zu tun hat, genaueres weiß man nicht.
 */
class IrgendeineKlasseDieWasMitEinerListeZuTunHat {
  /**
   * @param Auth-Daten Beschreibung
   * @param Data_from_ID Beschreibung
   * @param Data_to_ID Was das jetzt eigentlich macht, beschreibe ich erst mal lieber nicht.
   * @param Pagination Auch hier ist nicht wichtig, was es eigentlich macht.
   * @param maxRecord maximaler Datensatz
   * @return eine ... Liste von irgendwas?
   */
  RETURNCLASS getData(SonTyp Auth-Daten, NochNTyp Data_from_ID, NochNTyp Data_to_ID, AndererTyp Pagination,int maxRecord)
}

class AndereKlasse{
  void meinAufruf() {
      IrgendeineKlasseDieWasMitEinerListeZuTunHat list = ...;
      //Data_to_ID null, da ich keine Datensätze abgleichen möchte, sondern nur Abfrage.
      //Pagination ist null, weil ich bei Datensatz 1 starten möchte.
      list.getData(.....);
  }
}

Grundsätzlich gibt's 2 Ansätze.
1. Abfrage rein und dann so viele fetch-Aufrufe, bis nichts mehr kommt.
2. Bei jeder Abfrage ein Offset mit rein, ab welchem Index der Ergebnismenge geliefert werden soll.

Für 1 brauchst du eine Methode, die dir sagt, ob es noch Datensätze zu fetchen gibt - oder einfach abbrechen, wenn die Ergebnisliste leer ist.
Für 2 solltest du die Anzahl der Datensätze in der Ergebnismenge kennen und abbrechen, wenn dein Offset oder deine Page zu hoch wird.
 
Zuletzt bearbeitet:

belshop1

Mitglied
Okay. Entschuldigung, dass das so ein durcheinander ist..
Ich habe mich gestern noch den ganzen Tag damit beschäftigt den Code hinzubekommen. Nach ein paar Stunden hatte ich 1-2 Zeilen Code, die zumindest bis zu 2 Abfragen funktionierten, doch ab der dritten Abfrage entweder 100 Datensätze zu viel oder zu wenig ausgegeben haben. Ich würde den Code mal hier anfügen, aber mich auch gleichzeitig dafür entschuldigen, da dieser sehr Laienhaft aussieht^^.




Java:
for ( Number = 0; Number < 100;)
                {
                    FollowList DataList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481", null, Pagination, 100).execute();
                    Data = DataList.getPagination().getCursor();
                
                    if (Low >High){
                        FollowList testList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481", null,null, 100).execute();
                        testList.getFollows().forEach(follow -> {End++;index++; System.out.println(index + " " + follow.getToName());});
                        High++;
                        High++;
                        }
                        else {
                            End=0;
                            FollowList testList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481",null , Data, 100).execute();
                            Pagination=testList.getPagination().getCursor();
                            testList.getFollows().forEach(follow -> {End++;index++; System.out.println(index + " " + follow.getToName());});   
                        }
                 if (End < 100){
                 Number = 100;
                 }
                 else {
                     End=0;
                 }
 

Jw456

Top Contributor
Java:
for ( Number = 0; Number < 100;)
das ist doch eine Endlos Schleife
da fehlt Number++ Variablen bitte klein schreiben

Code:
for ( Number = 0; Number < 100; Number++)
 

KonradN

Super-Moderator
Mitarbeiter
Hier fällt mir nur ein Tipp ein: Versuch Code so zu schreiben, dass er lesbar ist. Das fängt schon damit an, dass man sich an die Regeln bezüglich Gross-/Kleinschreibung hält:
Variablen fangen mit einem kleinen Buchstaben an!

Dann sollte pro Zeile nur ein Befehl stehen. Lambda Ausdrücke sollten keine Blöcke sein.

Zu hohe Komplexität in Methoden sollte vermieden werden - da sollte man dann z.B. Code in mehrere Methoden unterteilen.

for Schleife ist eine Zählschleife. Wenn Du keine Zählschleife haben willst, dann mach auch keine. Deine Schleife scheint eher einer do while Schleife zu entsprechen.

Und der Sinn erschließt sich mir nicht. Beschreibe doch erst einmal, was Du da überhaupt machen willst.

Welche Version von Twitch4J nutzt Du? Die Dokumentation ist etwas irritierend.

Hier:
wird ein HystrixCommand zurück gegeben aber in der Doku unter
gibt es eine FollowList.

Wenn man wüsste, was Du für Abhängigkeiten hast, dann könnte man da direkt rein schauen.

Java:
for ( Number = 0; Number < 100;)
das ist doch eine Endlos Schleife
da fehlt Number++ Variablen bitte klein schreiben

Code:
for ( Number = 0; Number < 100; Number++)
Nein, das ist keine Endlosschleife, da er Number auf 100 setzt in der Schleife. Aber das ist so vom Code her extrem unleserlich!
 

belshop1

Mitglied
Vielen Dank schon einmal für die vielen Tipps!


frage mich auch wo in den ersten beiden Zeilen das Low oder High verändert wird für die if Bedingung.
es würde somit immer else ausgeführt werden.
Ich habe low mit 1 deklariert und high mit 0. Hätte ich auch mit in den Code schreiben sollen. Absolut mein Fehler.




Und der Sinn erschließt sich mir nicht. Beschreibe doch erst einmal, was Du da überhaupt machen willst.
Ich versuche das ganze mal zu erklären. Ich schreibe die Position mal dazu.


Als erstes möchte ich in dataList die ersten 100 Datensätze laden. -> Zeile 3
Java:
FollowList DataList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481", null, Pagination, 100).execute();

In data speicher ich mir dann die Pagination. -> Zeile 4
Code:
Data = DataList.getPagination().getCursor();



Im ersten Durchlauf wird die if Abfrage ausgeführt, da low mit 1 und high mit 0 deklariert ist. Mit 2x high++; erhöhe ich high und ab dem zweiten durchlauf wird nur noch else ausgeführt. -> Zeile 6 - 11
Code:
if (Low >High){
                        FollowList testList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481", null,null, 100).execute();
                        testList.getFollows().forEach(follow -> {End++;index++; System.out.println(index + " " + follow.getToName());});
                        High++;
                        High++;
                        }



In else möchte ich mir die nächsten 100 Datensätze (quasi Seite 2..3..4..) laden. Dafür brauche ich erst die Pagination der ersten Seite. -> Zeile 12 - 17

Code:
else {
                            End=0;
                            FollowList testList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481",null , Data, 100).execute(); 
                        }

Da bei dem ersten Schleifendurchlauf aber schon eine Pagination in data gespeichert wurde -> Zeile 3-4

Code:
FollowList DataList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(), "26490481", null, Pagination, 100).execute();
                    Data = DataList.getPagination().getCursor();

kann ich data einfach in testList einfügen und Seite 2 sollte mir ausgegeben werden.


Um das ganze fortlaufend zu machen, speicher ich mir einfach die Pagination der nächsten seite direkt -> Zeile 15
Code:
Data = DataList.getPagination().getCursor();



Ich hoffe ich konnte mein Vorgehen ein wenig verständlich- und übersichtlicher machen.



Welche Version von Twitch4J nutzt Du? Die Dokumentation ist etwas irritierend.

Ich benutze Twitch4j Version 1.11.0


Wenn man wüsste, was Du für Abhängigkeiten hast, dann könnte man da direkt rein schauen.

Was genau meinst du damit? Ich verstehe nicht ganz.

MfG Belshop1
 

KonradN

Super-Moderator
Mitarbeiter
Ich wollte genau diese Twitch4j Version wissen. Und ich sehe gerade, dass ich nicht gut genug geschaut habe - bei dem getFollowers(...) ist ja noch ein .execute() dran.

Deine Logik ist einfach nur Müll (Sorry für die Harten Worte!)

Die Logik ist doch ganz einfach so in der Art:
Java:
String pagination;
do {
    FollowList resultList = twitchClient.getHelix().getFollowers(..., pagination, 100).execute();
    // Mach etwas mit den Usern ...
    pagination = resultList.getPagination().getCursor();
} while (pagination != null);

Das wäre eine Möglichkeit zum Beispiel, wirklich alle Follower zu bekommen:
Java:
String pagination;
List<Follow> allFollower = new ArrayList<>();
do {
    FollowList resultList = twitchClient.getHelix().getFollowers(..., pagination, 100).execute();
    allFollower.addAll(resultList.getFollows());
    pagination = resultList.getPagination().getCursor();
} while (pagination != null);

Der Code ist wie so oft im Forum entstanden und kann daher Tippfehler und so enthalten.

Edit: Hinweis: HelixPagination.getCursor() hat eine schlechte Dokumentation. Da es aber @Nullable ist, bin ich erst einmal davon ausgegangen, dass es null ist, wenn es keine weitere Seite gibt. Zur Not einfach auch einmal ausgeben um das zu prüfen. Nicht dass es am Ende einen anderen Wert hat.
 
Beste Antwort

belshop1

Mitglied
Also ich habe den Code jetzt so angepasst und er funktioniert perfekt:
Java:
 String pagination=null;
             List<Follow> allFollower = new ArrayList<>();
             do {
                 FollowList resultList = twitchClient.getHelix().getFollowers(OAuth2 .getAccessToken(),"26490481",null, pagination, 100).execute();
                 allFollower.addAll(resultList.getFollows());
                 pagination = resultList.getPagination().getCursor();
             } while (pagination != null);
          allFollower.forEach(follow -> {index++;System.out.println(index + " " + follow.getToName());});

Wahnsinn, was mir Stunden- und Tagelanges Kopfzerbrechen gemacht hat, ist für euch eine Arbeit von 5 Minuten^^.
Ich sag schon mal vielen Dank und noch einen angenehmen Abend!
MfG Belshop1
 

Neumi5694

Top Contributor
Du hast es dir unterm Strich nur viel zu kompliziert vorgestellt. Meistens reicht es, die Schritte einmal auszuformulieren, ohne sich in Details zu verrennen, dann lässt sich das Ganze fast direkt in Code umsetzen.
Aber an der Formatierung (mehrere Befehle in einer Zeile) solltest du noch arbeiten.
In diesem Fall könntest du sogar nur einen Befehl verwenden

Java:
allFollower.forEach(follow -> System.out.println(++index + " " + follow.getToName()));
//++index erhöht zuerst den Wert, stellt den erhöhten Wert dann dem aufrufenden Kommando zur Verfügung.
//index++ würde zuerst das aufrufende Kommando mit dem Originalwert aufrufen, dann den Wert um 1 erhöhen.
 

KonradN

Super-Moderator
Mitarbeiter
Du hast es dir unterm Strich nur viel zu kompliziert vorgestellt. Meistens reicht es, die Schritte einmal auszuformulieren, ohne sich in Details zu verrennen, dann lässt sich das Ganze fast direkt in Code umsetzen.
Aber an der Formatierung (mehrere Befehle in einer Zeile) solltest du noch arbeiten.
In diesem Fall könntest du sogar nur einen Befehl verwenden

Java:
allFollower.forEach(follow -> System.out.println(++index + " " + follow.getToName()));
//++index erhöht zuerst den Wert, stellt den erhöhten Wert dann dem aufrufenden Kommando zur Verfügung.
//index++ würde zuerst das aufrufende Kommando mit dem Originalwert aufrufen, dann den Wert um 1 erhöhen.
Und das ist eine Lösung, die so nicht funktioniert, da eine Variable in einem lambda Ausdruck final oder "effectively final" sein muss.

Mit einer AtomicInteger Instanz würde sowas gehen mit einem Aufruf von incrementAndGet() - aber auch das ist nicht so wirklich das, was ich nutzen würde.

Wenn man ein foreach haben will - was spricht gegen die gute alte for-each Schleife?
 

Neumi5694

Top Contributor
Und das ist eine Lösung, die so nicht funktioniert, da eine Variable in einem lambda Ausdruck final oder "effectively final" sein muss.

Mit einer AtomicInteger Instanz würde sowas gehen mit einem Aufruf von incrementAndGet() - aber auch das ist nicht so wirklich das, was ich nutzen würde.

Wenn man ein foreach haben will - was spricht gegen die gute alte for-each Schleife?
Stimmt, an die final Eigenschaft hab ich gerade nicht gedacht beim Code lesen.
 

belshop1

Mitglied
Guten morgen :)

Ich stehe leider schon wieder vor dem nächsten Problem^^
Ich möchte mir nun anzeigen lassen, ob der User in einem seiner gefolgten Kanälen ist.
Das ganze habe ich schon mit einer for Schleife gelöst.

Java:
public void checkAllChannels(String name, List<String> channels) {
        boolean contain=false;
        for(int i = 0; i<channels.size();i++) {
            String connect = channels.get(i);
            Chatters chatJoin = twitchClient.getMessagingInterface().getChatters(connect).execute();
            System.out.println("Suche in Kanal " +i + " "+ connect);
            contain = chatJoin.getAllViewers().contains(name);
            System.out.println("Nichts gefunden in Kanal: " + contain);
            if(contain == true) {
                System.out.println("Gefunden in Kanal: " + connect);
                break;
            }
        }
    }

Jetzt würde ich aber diese Schleife gern so oft wiederholen, bis der User irgendwann in einem Kanal gefunden wurde. An sich keine schwierige Aufgabe denke ich. Ich hab das schon mal mit einer do-while und while Schleife versucht.

Code:
public void testdowhile(List<String> channels, String channelname) {
        int zähler=0;
        boolean abgleich;
        do {
            Chatters chatJoin = twitchClient.getMessagingInterface().getChatters(channels.get(zähler)).execute();
            System.out.println(zähler + " " + channels.get(zähler));
            
            abgleich = chatJoin.getAllViewers().contains(channelname);
            if(zähler > channels.size()) {
                zähler=-1;
            }
            zähler++;
        }while(abgleich==false);
        zähler--;
        System.out.println("Kanal gefunden in: " + channels.get(zähler));
        System.out.println(abgleich);
    }


Code:
    public void testwhile(List<String> channels, String channelname) {
        int zähler=0;
        boolean abgleich=false;
        
        while(abgleich == false) {
            Chatters chatJoin = twitchClient.getMessagingInterface().getChatters(channels.get(zähler)).execute();
            System.out.println(zähler + " " + channels.get(zähler));
            
            abgleich = chatJoin.getAllViewers().contains(channelname);
            if(zähler > channels.size()) {
                zähler=0;
            }
            zähler++;
        }
    }
        }

Allerdings funktioniert das ganze nicht so wie ich mir das vorgestellt habe. Ich finde keine Lösung den int zähler (index der channels) zurück zu setzen. Deswegen bekomme ich den Fehler "Index 187(indexgröße) out of bounds for length 187(indexgröße)"
Mit Sicherheit habe ich wieder einfache Logikfehler wie beim letzten mal^^

Über kleine Denkanstöße würde ich mich sehr freuen. :)
 
Zuletzt bearbeitet:

Neumi5694

Top Contributor
Java:
    if(zähler > channels.size()) {
        zähler=0;
    }
    zähler++;
Ersetze das mal durch
Java:
    zähler++;
    if(zähler >= channels.size()) {
        zähler=0;
    }
oder hierdurch (das macht das Gleiche. Wichtig: "++" muss VOR der Variable stehen.
Java:
    if(++zähler >= channels.size()) {
        zähler=0;
    }
Grund:
1. VOR der Prüfung erhöhen, sonst wird der Wert nie wieder 0 sein, da du gleich im Anschluss um 1 erhöhst.
2. Vergleich muss >= sein, channel.size() darf nie erreicht werden.


Und nimm bitte die Umlaute aus dem Quellcode. Das kann zu Problemen führen, wenn dein Compiler zum Einlesen des Quellcodes nicht das selbe Encoding verwendet wie du zum Speichern.
 

belshop1

Mitglied
Spitze! Das war der Fehler. Die Umlaute werde ich direkt aus dem Code entfernen.
Noch eine kurze Frage: Angenommen der User wird nie in einem dieser Kanäle auftauchen. Dann wäre die do-while Schleife eine Endlosschleife. In einigen Guides zu Schleifen habe ich gelesen, dass man Endlosschleifen vermeiden sollte. Könnte man den Code dann so stehen lassen? Oder sollte ich mir generell eine andere Methode zur Lösung überlegen?
 

Neumi5694

Top Contributor
Endlosschleifen sind fast nie gut, das stimmt. Manchmal geht's aber nicht anders, dann achtet man aber darauf, dass sie nicht die ganze Zeit über ausgeführt werden, sondern pausiert sie nach jedem Durchgang.

Was wie am besten zu lösen ist, hängt stark davon ab, was dein Programm eigentlich tun soll. Was soll passieren, wenn der User in keinem Kanal auftaucht? Warum wird aufgehört zu suchen, sobald er in einem Kanal auftaucht? Kann er auch in mehreren Kanälen präsent sein? Was, wenn er einen Kanal wieder verlässt? Wird in dem Fall neu ausgewertet? Was, wenn er die Verbindung verlorten hat und in einem Kanal aufscheint, obwohl er nicht mehr drin ist?

Vielleicht fällt dir auf, dass ich hier Ereignisse beschreibe und frage, was deren Folge sein soll.
Es wäre von mir aus gesehen sinnvoll, dass du anfängst, mit Events zu arbeiten.

Eine Möglichkeit wäre, dass du einen Hintergrundthread hast, der einen einzelnen Suchvorgang ausführt, dann pausiert und dann nochmal sucht.
die Events Join und Leave wecken diesen periodischen Thread aus seinem Schlummer auf. Der Thread sucht dann nach Änderungen (alternativ steht im Join-Event aber auch schon drin, wer welchem Kanal beigetreten ist).
 

belshop1

Mitglied
Vielen dank für deinen Input. Das erweitert meine Gedanken enorm.
Wie würde denn so ein Code mit Events bspw. aussehen? Aktuell habe ich mir eine provisorische UI gebastelt und über Buttons führe ich alles aus.
 

Neumi5694

Top Contributor
Irgend etwas löst ja den Beitritt eines Users zu einem Kanal aus (was ja an sich schon der Event ist). Du kannst zu diesem Zeitpunkt den Thread darauf hinweisen. Dafür braucht dieser eine entsprechende Methode, wie z.B. wakeUpSomethingHappened().

Wenn man jetzt mehrere Teile des Programms hat, die bei einem Join benachrichtigt werden wollen, kann man natürlich alle einzeln aufrufen. Das ist aber dann ziemlich hardcodiert.
Sinnvoller: Die Klasse, die das verwaltet, hat eine Liste aller Interessenten. Wenn dann ein der Join ausgeführt wird, dann benachrichtigt sie über eine standardisierte Methode alle Interessenten.

Genau so funktioniert der ActionListeners eines Buttons z.B.
Wenn du .addActionListener() aufrufst, dann wird dieser Listener der Liste hinzugefügt. Wenn dann irgend etwas entsprechendes passiert, dann löst AWT aus, dass alle Interessenten benachrichtigt werden. Dafür wird ein Objekt mit Informationen darüber befüllt, was eigentlich passiert ist (Source, Mausposition usw.) und schickt es an alle in der Liste.
 

belshop1

Mitglied
Guten Abend..

Ich habe mir jetzt ein paar Gedanken dazu gemacht und 1,2 Zeilen Theorie geschrieben. Meine Frage wäre, ob man das so lösen würde..

Java:
    public void channelJoinEvent() {
          twitchClient.getChat().getEventManager().onEvent(ChannelJoinEvent.class, event ->
          {
              wakeUp("join");
          });
    }
    
    public void channelLeaveEvent() {
        twitchClient.getChat().getEventManager().onEvent(ChannelLeaveEvent.class, event ->
        {
            wakeUp("leave");
        });
    }
    
    public void wakeUp(String whatHappend) {
    
        if(whatHappend == "join")
        {
            do something...
        }
        
        if(whatHappend == "leave")
        {
            do something...
        }
        
        
    }
 

KonradN

Super-Moderator
Mitarbeiter
Ich würde sagen: Eher nicht. Aber dazu wäre wichtig, dass man die verwendeten Libraries genau kennt. Du nutzt hier twitch4j so ich das richtig sehe.

Ganz wichtig: Strings vergleicht man nicht mit == sondern mit equals Aufrufen!

1) channelJoinEvent und channelLeaveEvent sind Methoden, die doch nur eine Initialisierung machen. Und Lambda Expressions sollten eigentlich nicht mit Block geschrieben werden. Du hast ja nur einen Aufruf. Das wäre also vermutlich eher etwas wie:

Java:
    public void init() {
          var eventManager = twitchClient.getChat().getEventManager();
          eventManager.onEvent(ChannelJoinEvent.class, event -> wakeUp("join"));
          eventManager.onEvent(ChannelLeaveEvent.class, event -> wakeUp("leave"));
    }

Dann ist deine Methode wakeUp so unnötig. Schreiben wir das alles mal etwas um:
2) Die Methode wird sehr lang, wenn Du da in den if Blöcken immer mehrere Dinge machst. Dann ist es einfacher, da Methoden aufzurufen.
Das ergibt dann Teile wie:
Java:
        if(whatHappend == "join") {
            handleJoinEvent();
        }

3) Damit macht die Methode nichts anderes, als andere Methoden aufrufen. Und damit ist diese obsolet, denn statt wakeUp("join") kannst Du ja direkt handleJoinEvent aufrufen.

4) Dann gibt es einen Parameter, den Du einfach unterschlägst. Den würde ich nicht unterschlagen, denn ggf. brauchst Du das später noch:
Java:
    public void init() {
          var eventManager = twitchClient.getChat().getEventManager();
          eventManager.onEvent(ChannelJoinEvent.class, event -> handleJoinEvent(event));
          eventManager.onEvent(ChannelLeaveEvent.class, event -> handleLeaveEvent(event));
    }

5) Damit hat die Methode die richtige Signatur und Du kannst direkt Methodenreferenzen verwenden:
Java:
    public void init() {
          var eventManager = twitchClient.getChat().getEventManager();
          eventManager.onEvent(ChannelJoinEvent.class, this::handleJoinEvent);
          eventManager.onEvent(ChannelLeaveEvent.class, this::handleLeaveEvent);
    }

Damit wäre dann der Code schon deutlich verständlicher und übersichtlicher.

Wenn man so eine Methode wie dein wakeUp dennoch haben wollte, dann wäre da zu überlegen:
a) Kein "magic numbers" - also diese Literale werden zu Konstanten. Oder da es eine feste Anzahl Konstanten sind, die zusammen gehören: Eine Enumeration!
b) Statt der vielen if Abfragen: ein switch Statement wäre hier auch das, was ich bevorzugen würde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
M Ausgabe beim Overloading Java Basics - Anfänger-Themen 3
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
M Java Ausgabe der höchsten Zahl Java Basics - Anfänger-Themen 14
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
W Streams in Java und was bedeutet meine Konsolen-Ausgabe? Java Basics - Anfänger-Themen 4
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
B Deadlock verstehen der Ausgabe! Java Basics - Anfänger-Themen 12
Lion.King Ausgabe mit Eigenschaften Java Basics - Anfänger-Themen 4
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
Xaver code Tastatur ausgabe Java Basics - Anfänger-Themen 4
R Anfänger: Ausgabe kommt minus raus? Java Basics - Anfänger-Themen 6
K Leerzeile in Konsolen-Ausgabe Java Basics - Anfänger-Themen 4
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
Q return Ausgabe Java Basics - Anfänger-Themen 4
C Java Arrays - Ausgabe in Methode Java Basics - Anfänger-Themen 12
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
S Ausgabe des Variablenwerts Java Basics - Anfänger-Themen 10
I Ausgabe nicht nur senkrecht sondern auch waagerecht. Java Basics - Anfänger-Themen 2
paulen1 Methoden Unerwünschte Ausgabe bei System.out.print in For-Schleife Java Basics - Anfänger-Themen 8
C Ausgabe boolean return ((n==9)||(n==0)); Java Basics - Anfänger-Themen 13
F Double Ausgabe nicht wissenschaftlich Java Basics - Anfänger-Themen 16
danieldemetry Java - Graph Komponenten - Ausgabe Java Basics - Anfänger-Themen 0
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B Ausgabe in TextArea funktioniert nicht Java Basics - Anfänger-Themen 2
D BigDecimal Ausgabe sehr lang. Java Basics - Anfänger-Themen 2
J String Ausgabe Java Basics - Anfänger-Themen 2
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
KogoroMori21 Array-Ausgabe Java Basics - Anfänger-Themen 6
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
E Ausgabe überschreiben Java Basics - Anfänger-Themen 15
D Ausgabe von Array Java Basics - Anfänger-Themen 2
U Ausgabe Java Basics - Anfänger-Themen 4
J Buchstabenhäufigkeit mit Array und Ausgabe des häufigsten Buchstaben Java Basics - Anfänger-Themen 25
V Multiplikationstafel - Ausgabe Java Basics - Anfänger-Themen 4
L Warum ist die Ausgabe anders als das was im Bezeichner steht? Java Basics - Anfänger-Themen 4
M In gleicher zeile hinter ausgabe noch etwas ausgeben Java Basics - Anfänger-Themen 1
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
R Call-by-Value, Call-by-Reference, Call-by-Name Ausgabe Java Basics - Anfänger-Themen 1
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
D Warum erfolgt folgende Ausgabe und warum? Java Basics - Anfänger-Themen 4
C Ausgabe in der Konsole Java Basics - Anfänger-Themen 11
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
A Ausgabe mit boolean Java Basics - Anfänger-Themen 3
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
Y Methode + Parameters + Ein und Ausgabe Java Basics - Anfänger-Themen 1
K Methodenaufruf /-ausgabe Java Basics - Anfänger-Themen 5
A Wiederholte Ausgabe vermeiden Java Basics - Anfänger-Themen 16
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
M Wie analysiert JSON eine toString-Ausgabe ? Java Basics - Anfänger-Themen 1
T Vererbung Verschiedene Fahrzeugtypen mit unterschiedlicher Ausgabe Java Basics - Anfänger-Themen 17
T Ausgabe einer for Schleife Java Basics - Anfänger-Themen 2
S Elemente eines Arrays bei Ausgabe auslassen Java Basics - Anfänger-Themen 2
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Unterklassen (Klasse für Ausgabe) Java Basics - Anfänger-Themen 4
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
J Methode zur Ausgabe eines Dreiecks aus Sternen schreiben? Java Basics - Anfänger-Themen 2
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
B Keine Ausgabe .. Woran liegt das? Ich komme nicht weiter Java Basics - Anfänger-Themen 14
K Rechtsbündige Ausgabe von Zahlen Java Basics - Anfänger-Themen 6
V Erste Schritte for-Schleife; Ausgabe soll alle 5 Sekunden erfolgen. Java Basics - Anfänger-Themen 4
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Ausgabe Gesamtpreis Java Basics - Anfänger-Themen 39
E Variablen in formatierter Ausgabe Java Basics - Anfänger-Themen 15
B HQL / Hibernate, GroupBy und Ausgabe als Double Java Basics - Anfänger-Themen 1
J StrinBuffer in der Ausgabe Java Basics - Anfänger-Themen 4
H ausgabe? Java Basics - Anfänger-Themen 32
B Ausgabe Zahlenreihe Horizontal Java Basics - Anfänger-Themen 3
V Neue Ausgabe von toString nach Methodenaufruf Java Basics - Anfänger-Themen 9
N Wochentagberechner Ausgabe funktioniert nicht Java Basics - Anfänger-Themen 7
K Array Ausgabe Java Basics - Anfänger-Themen 2
L Datentypen Ausgabe von eigenem Datentypen Java Basics - Anfänger-Themen 2
C 1x1 Ausgabe auf dem Bildschirm Java Basics - Anfänger-Themen 3
L Fehler im Programm bei Ausgabe Java Basics - Anfänger-Themen 21
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
F Warum ist die Ausgabe hier 1? Java Basics - Anfänger-Themen 4
Bun17 Keine Ausgabe in der Konsole Java Basics - Anfänger-Themen 2
H Ausgabe Java Basics - Anfänger-Themen 6
U Ausgabe von Dateiinhalt während Programmnutzung fehlerhaft Java Basics - Anfänger-Themen 3
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
F Erste Schritte Subnet Calculator - Ausgabe der NetID und der Broadcast Java Basics - Anfänger-Themen 4
D Wiederholende Ausgabe Java Basics - Anfänger-Themen 3
G Exception und Ausgabe der Duplikate Java Basics - Anfänger-Themen 6
A Datei Ein und Ausgabe FileWriter und printWriter Java Basics - Anfänger-Themen 5
S Doppel For Schleife mit Arrays - Problem bei der Ausgabe Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben