Java Lambda Ausdrücke

Diskutiere Java Lambda Ausdrücke im Java Basics - Anfänger-Themen Bereich.
G

Gansa

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();


    }
}
 
sascha-sphw

sascha-sphw

Java:
public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    });
    thread.start();
}
 
mrBrown

mrBrown

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);
            }
        });
 
I

insert2020

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...
 
Flown

Flown

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();
 
A

affot

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?
 
I

insert2020

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?
Es wäre sauberer, eine Runnable-Objekt zu übergeben, anstatt run() von Thread direkt zu überschreiben, das stimmt.
 
I

insert2020

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:

 
A

affot

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?
 
A

affot

mrBrown

mrBrown

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 :)
 
G

Gansa

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!
 
Thema: 

Java Lambda Ausdrücke

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben