Fragen bezgl. Lambdas

tt357

Mitglied
Ich haette eine Frage zu folgendem Lambda:
Java:
import java.util.*;
public class GFG {

    public static void main(String[] args)
    {
        // create an ArrayList which going to
        // contains a list of Numbers
        ArrayList<Integer> Numbers = new ArrayList<Integer>();

        // Add Number to list
        Numbers.add(23);
        Numbers.add(32);
        Numbers.add(45);
        Numbers.add(63);

        // forEach method of ArrayList and
        // print numbers
        Numbers.forEach((n) -> System.out.println(n));
    }
}
Woher weiß er das sotieren soll? Ich meine wenn ich selbst Lambdas mit eigenen Interfaces erstelle kann ich es i.d.R noch nachvollziehen, aber hier ist es so das diesem Lambda das functional Interface public void forEach(Consumer<? super E> action) zugrunde liegt.
Wird das Lambda wie folgt ausgewertet:
(n -> System.out.println(n)) muss fuer den Compiler ja das Consumer<? super E> action> sein, bzw. das Interface in der forEach Schleife. Nur wie kommt er jetzt darauf alle Strings, Integers usw. zu sotieren? In der Doc findet sich zum Consumer Interface folgendes "This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference." Mir erschließt sich immer noch nicht wie der Compiler darauf kommt, zu sotieren. Weiß da jmd. weiter?

mfg
 
Wie kommst du darauf, dass hier sortiert wird? Du fügst die Zahlen ja bereits in aufsteigend sortierter Reihenfolge in die Liste hinzu.
forEach auf der Liste (bzw. auf dem Iterable Interface) liefert die Element der Liste einfach nur in Einfüge-Reihenfolge, bzw. in der Reihenfolge, die die List definiert.
Das hat nichts mit Lambdas zu tun.
 
Ich kam darauf, weil das Consumer Interface zwei Methoden besitzt: andThen und accept. Dachte er ruft andThen auf.
Aber dann stellt sich mir immer noch die Frage, wie der Compiler das Lambda genau auswertet? (n) -> System.out.println(n)) wird an das Consumer Interface übergeben. Woher weiß der Compiler als erstes: Das er alle Werte durchgehen soll, sprich alle darin enthaltenen Zahlen und welche Funktion ruft er im Consumer Interface auf bzw. was geschieht damit eig. genau?
 
Der Compiler weiß das nicht. Das steht in der Implementierung der Iterable.forEach() Methode:
Java:
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
bzw. der Überschreibung dieser Methode in ArrayList (ist hier aber irrelevant, du kannst dir genauso gut die Iterable-Implementierung angucken):
Java:
    @Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        final Object[] es = elementData;
        final int size = this.size;
        for (int i = 0; modCount == expectedModCount && i < size; i++)
            action.accept(elementAt(es, i));
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
 
Also wird (n) -> System.out.println(n) entsprechend der Anzahl der Elemente in der Liste aufgerufen? Oder werden alle ListenElmente gesammelt und dann wird Iterable.forEach aufgerufen?
 
Also wird (n) -> System.out.println(n) entsprechend der Anzahl der Elemente in der Liste aufgerufen? Oder werden alle ListenElmente gesammelt und dann wird Iterable.forEach aufgerufen?
Die forEach Implementierung in ArrayList geht halt einfach alle Listenelemente durch und ruft für jedes dieser Listenelemente die accept() Methode des Consumers auf.
 
Ist ja immerhin ein Lamba-Ausdruck.
Meine Aussage, dass das nichts mit Lambdas zu tun hat, bezog sich darauf, dass hier Zahlen sortiert ausgegeben werden. Das hat einzig allein etwas damit zu tun, dass die Zahlen bereits sortiert in die Liste eingefügt worden sind. Dass hier ein Lambda-Ausdruck zum Ausgeben der Zahlen verwendet wird, sortiert die Zahlen nicht. Das wollte ich damit sagen.
 
Ich sachs ja, etwas nachdenken kann nicht schaden. 😛

Der Compiler weiß das nicht. Das steht in der Implementierung der Iterable.forEach() Methode:

bzw. der Überschreibung dieser Methode in ArrayList (ist hier aber irrelevant, du kannst dir genauso gut die Iterable-Implementierung angucken):

Man könnte noch das Cosumer-Interface heranziehen, aber das ist mehr oder weniger langweilig. Da passiert die Action nicht. Aber es könnte beim Verstehen der Lambdas helfen....
 

Neue Themen


Zurück
Oben