Lamdba auf EventHandler

S

Sandro95

Aktives Mitglied
Einen sguten Tag Leute ,
mir ist bewzusst wie man Lambdas implementiert und deren Nutzen. Nun stehe ich vor derAufgabe diesen EventHanlder mit einem Lambda zu modifizieren

"
// Eventhanlder für den Button neu

// neu.setOnAction(new EventHandler<ActionEvent>() {
//
// public void handle(ActionEvent e) {
// try {
// if (t1.getText() != null && t2.getText() != null) {
// bild.setTitel(t1.getText());
// bild.setOrt(t2.getText());
// bild.setJahr(Integer.parseInt(t3.getText()));
// stage.close();
// }
//
// } catch (NumberFormatException ee) {
// Label wrong = new Label(" Eingabe bitte Prüffen");
// box.getChildren().add(wrong);
// }
//
// }
// });

neu.setOnAction((ActionEvent e)->);


Das ich eine Exception in einem LAmbda habe ist mir dabei neu . Wie geht man bei sowas ran ?


mfg
 
kneitzel

kneitzel

Top Contributor
Also eine Möglichkeit ist, einen Wrapper zu haben, der die Exception handhabt. Dann kannst Du den Lambda wie gewohnt schreiben nur eben muss es im Wrapper Aufruf sein (Sprich der Wrapper hat einen Consumer als Parameter, so dass da ein Lambda Ausdruck möglich ist).

Das Ganze wird z.B. unter https://www.baeldung.com/java-lambda-exceptions beschrieben.
 
S

Sandro95

Aktives Mitglied
@JustNobody , also kann man ein LmabdaWrapper erstellen ?
die ganze if abfrage packe ich dann aber nicht im Lambda doder ?Bei einem Lambda werden ja die ganzen schleifen , if abfragen nicht gezeigt das passiert ja mehr oder wenige im Hintergung?
 
H

httpdigest

Top Contributor
Die Expression eines Lambdas kann auch ein Block-Statement sein:
Java:
neu.setOnAction(e -> {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte Prüffen");
    box.getChildren().add(wrong);
  }
});
 
S

Sandro95

Aktives Mitglied
Die Expression eines Lambdas kann auch ein Block-Statement sein:
Java:
neu.setOnAction(e -> {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte Prüffen");
    box.getChildren().add(wrong);
  }
});


aber die Lambdas dienen ja zur kürzung des code , was in diesem Fall nicht wirklich eintritt oder ?
 
kneitzel

kneitzel

Top Contributor
Also erst einmal: Du kannst im Lambda ganze Codeblöcke haben:
Code:
neu.setOnAction(e -> {  // Hier brauchst Du den Typ nicht!
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
});

Aber solche Blöcke sind natürlich nicht wirklich lesbar.

Daher packt man sowas eher in eine Methode.
Code:
 protected void someAction(ActionEvent e) {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
}

// Und dann einfach eine Methodenreferenz nutzen:
neu.setOnAction(this::someAction);

Das wäre dann etwas, wie ich es wohl bauen würde.

Die Idee eines ExceptionHandlers ist mehr dazu da, dass man dann etwas machen kann, das auch Exceptions wirft.

Dann hätte man sowas wie:

Code:
neu.setOnAction(myExceptionHandlerMethod(() -> {....} );

Das macht aber aus meiner Sicht nur Sinn, wenn man einfache Aufrufe hat. Also keinen Block Code, denn der wird immer schnell unlesbar.
 
S

Sandro95

Aktives Mitglied
Also erst einmal: Du kannst im Lambda ganze Codeblöcke haben:
Code:
neu.setOnAction(e -> {  // Hier brauchst Du den Typ nicht!
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
});

Aber solche Blöcke sind natürlich nicht wirklich lesbar.

Daher packt man sowas eher in eine Methode.
Code:
 protected void someAction(ActionEvent e) {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
}

// Und dann einfach eine Methodenreferenz nutzen:
neu.setOnAction(this::someAction);

Das wäre dann etwas, wie ich es wohl bauen würde.

Die Idee eines ExceptionHandlers ist mehr dazu da, dass man dann etwas machen kann, das auch Exceptions wirft.

Dann hätte man sowas wie:

Code:
neu.setOnAction(myExceptionHandlerMethod(() -> {....} );

Das macht aber aus meiner Sicht nur Sinn, wenn man einfache Aufrufe hat. Also keinen Block Code, denn der wird immer schnell unlesbar.


in der Aufgabe steht , ich soll die bisherigen EventHandler mit Lambdas modifizeiren also geht die Option mit der Methode erstellen ja nicht .
 
mihe7

mihe7

Top Contributor
in der Aufgabe steht , ich soll die bisherigen EventHandler mit Lambdas modifizeiren also geht die Option mit der Methode erstellen ja nicht .
Warum sollte das nicht gehen? Allerdings enthält neu.setOnAction(this::someAction) kein Lambda, sondern eine Methodenreferenz. Mit Lambda wäre das neu.setOnAction(e -> someAction(e));
 
S

Sandro95

Aktives Mitglied
Warum sollte das nicht gehen? Allerdings enthält neu.setOnAction(this::someAction) kein Lambda, sondern eine Methodenreferenz. Mit Lambda wäre das neu.setOnAction(e -> someAction(e));


ja so habe ich das ja auch schon oben am bei meiner Frage gemacht . nur weiß ich halt nich twie ich das genau mit der Exception in dem eig. Eventhandler mache . wie ich die Exception im Ausdruck miteinbeziehe
 
kneitzel

kneitzel

Top Contributor
Wenn Du einen Code-Block hast, dann funktioniert das genau so wie immer. Wenn Du die Exception nicht im Code-Block behandeln willst, dann ginge noch der Lambda Wrapper, der die Exception fängt und behandelt...

Ansonsten muss ich gestehen, dass ich nicht ganz Dein Problem verstehe - evtl. kannst Du ja noch mit mehr Details schildern, was Dein konkretes Problem ist.
 
S

Sandro95

Aktives Mitglied
Ich soll meine GUI die EventHandler als Lambda Ausdrucke imolementieren ( die EventHandler davor waren easy weil dort keien Exception drin waren) . So jetzt wie oben am Anfang beschrieben ist in dem EventHandler eine Exception und ich weiß nicht wirklich wie ich diese als Lambda modifizieren soll.
aufgabenblatt ist im anhang.

@JustNobody
 

Anhänge

  • pk1-praktikum11.pdf
    57,7 KB · Aufrufe: 2
kneitzel

kneitzel

Top Contributor
Aber dann ist es doch wie in #6 zuerst geschrieben: einfach ein Lambda Ausdruck, der halt dann einen ganzen Block bekommt.

Was stört Dich an dieser Variante (außer, dass so Blöcke in Lambda-Ausdrücken unleserlich sind und daher eher vermieden werden sollten ... hier ist es ja explizit gefordert.

Oder eben man packt es in eine Methode und ruft diese dann per Lambda Ausdruck auf wie @mihe7 in #8 aufgezeigt hat ...
 
S

Sandro95

Aktives Mitglied
also wäre die Option vollkommen okay ? das ganze im einen größeren Block zu packen ?
Das mit de Exception hat mich durcheinander gebracht sorry..
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben