Java Lambda Ausdrücke

Gansa

Aktives Mitglied
Hallo, ich hab hier ein kleines Programm das ich mit einem Lambda Ausdruck ausführen möchte. Wie kann ich hier am besten lambda einsetzten ? ich bin leider so verwirrt in diesem Thema. Danke falls jemand helfen kann!

Java:
    public static void main(String[] args) {

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        });
          thread.start();


    }
}
 
Java:
public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    });
    thread.start();
}
 
Wie kann ich hier am besten lambda einsetzten ? ich bin leider so verwirrt in diesem Thema. Danke falls jemand helfen kann!
Die Umformung von anonymer Klasse zu Lambda läuft immer gleich ab:
  1. Klasse um die Methode entfernen
  2. Modifier, Rückgabetyp und Namen der Methode entfernen, Parameter stehen lassen
  3. zischen Parameter und geschweifter Klammer einen Pfeil (->) einfügen

In diesem Fall also, Schritt 1:
Java:
        Thread thread = new Thread(
            @Override
            public void run() {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        );

Schritt 2:
Java:
        Thread thread = new Thread(
            () {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        );

Schritt 3:
Java:
        Thread thread = new Thread(
            () -> {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        );

Schön formatieren:
Java:
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 10; i++){
                System.out.println(i);
            }
        });
 
Ich würde hier auf CompletableFuture ausweichen und ausschließlich Streams verwenden...
Java:
	public static void main(String[] args) {
		CompletableFuture.runAsync(() -> IntStream.range(0, 10).forEach(System.out::println));
		System.out.println(10);
		ForkJoinPool.commonPool().awaitQuiescence(10, TimeUnit.SECONDS);
	}
liest sich schöner.

Die letzte Anweisung ist noch dafür dass das Programm noch auf die Ausgabe wartet...
 
Die letzte Anweisung ist noch dafür dass das Programm noch auf die Ausgabe wartet...
Warum nicht auf das Future Objekt selbst warten?
Java:
var future = CompletableFuture.runAsync(() -> IntStream.range(0, 10).forEach(i -> System.out.println(Thread.currentThread().toString() + ':' + i)));
System.out.println(Thread.currentThread().toString() + ':' + 100);
future.join();
 
Zu der oben genannten Lösung hätte ich mal ne Frage.

Wieso funktioniert das so? Für einen Lambda Ausdruck benötige ich ein funktionales Interface mit einer Methode, damit klar ist, welche Methode hier überschrieben wird. Die Klasse Thread hat doch aber total viele Methoden? Kann es sein, dass die Objektvariable nicht Thread sondern Runnable sein muss oder hab ich einen Denkfehler?
 
Die Klasse Thread ja, aber der Lamda Ausdruck ist für ein Runnable, das Argument für Thread.
Meines Wissens ist die verkürzte Lambda-Schreibweise hierbei nicht für ein Runnable stellvertretend.

Sorry @mrBrown hat recht:

 
Das habe ich mir schon gedacht... Aber woher weiß der Compiler denn, dass an dieser Stelle ein Runnable übergeben wird??
Der Konstruktur von Thread ist schließlich überladen? Könnte ja genauso ein String sein?
 
Aber doch nicht zwingend?

Konstruktoren
publicThread()
publicThread(Runnable target)
publicThread(String name)
publicThread(ThreadGroup group, String name)
publicThread(Runnable target, String name)
publicThread(ThreadGroup group, Runnable target)
publicThread(ThreadGroup group, Runnable target, String name)
publicThread(ThreadGroup group, Runnable target, String name, long stackSize)
Aber nur einer davon ist ein Konstruktor, der genau einen Parameter hat, der ein Functional Interface ohne Parameter und mit void-Rückgabetyp ist 🙂
 
Die Umformung von anonymer Klasse zu Lambda läuft immer gleich ab:
  1. Klasse um die Methode entfernen
  2. Modifier, Rückgabetyp und Namen der Methode entfernen, Parameter stehen lassen
  3. zischen Parameter und geschweifter Klammer einen Pfeil (->) einfügen

In diesem Fall also, Schritt 1:
Java:
        Thread thread = new Thread(
            @Override
            public void run() {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        );

Schritt 2:
Java:
        Thread thread = new Thread(
            () {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        );

Schritt 3:
Java:
        Thread thread = new Thread(
            () -> {
                for (int i = 0; i < 10; i++){
                    System.out.println(i);
                }
            }
        );

Schön formatieren:
Java:
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 10; i++){
                System.out.println(i);
            }
        });
Vielen dank für die Super Erklärung!
 

Zurück
Oben