Sinn von Lambdas?

Bela B.

Aktives Mitglied
Ich verstehe ehrlich gesagt nicht, was an Lambdas so besonders sein soll? Irgendwie erschließt sich mir nicht, was man damit besser/eleganter machen kann als mit "normalem" Code.

Kann mich da vielleicht einer von euch aufschlauen oder ist eurer Meinung nach das Verstehen von Lambdas nicht (so) wichtig?
 

mrBrown

Super-Moderator
Mitarbeiter
Mein Lieblingsbeispiel: Entfernen von Elementen mit bestimmten Eigenschaften aus einer Liste.

Wie würdest du das ohne Lambdas umsetzen?

Java:
ints.removeIf(i -> i != 42)
 

Thallius

Top Contributor
Ja, der Vergleich zeigt den Nutzen ziemlich eindrucksvoll.

Stimmt in dem Fall finde ich die Lambas auch fein.

Aber aber in vielen Fällen sind diese Verkürzungen alles nur nicht hilfreich. Nehmen wir mal Annotations und Beans. Hier werden durch irgendwelche „Magic Keys“ komplette Code Teile ersetzt und kaum einer der Programmierer die diese benutzen weiß eigentlich was da passiert. So etwas finde ich nicht hilfreich und auch nicht fortschrittlich. Sowas finde ich gefährlich...
 

mrBrown

Super-Moderator
Mitarbeiter
Annotations und Beans (was meinst du damit überhaupt) haben allerdings nichts mit Lambdas am Hut.

Erstere sind *das* Ding für jegliches Framework, auf die will ich absolut nicht verzichten.
Das ein Programmierer noch alles in's kleinste Detail überblickt ist sowieso Wunschdenken
 

Thallius

Top Contributor
Annotations und Beans (was meinst du damit überhaupt) haben allerdings nichts mit Lambdas am Hut.

Erstere sind *das* Ding für jegliches Framework, auf die will ich absolut nicht verzichten.
Das ein Programmierer noch alles in's kleinste Detail überblickt ist sowieso Wunschdenken

Genau wie du sagst Wunschdenken. Also wünscht man sich das. Warum sollte man also nicht versuchen dem zumindest so nahe wie möglich zu kommen?
Statt dessen geht die aktuelle Entwicklung genau in die andere Richtung. Einfach weil es billiger in der Entwicklung ist. Das ist genau wie alles andere in der heutigen globalen Welt. Billig muss es sein. Nicht gut. Also schreiben wir Software indem wir Module zusammen klicken von denen wir nicht den Ansatz einer Ahnung haben was sie machen, von denen wir nur 10% brauchen und welche wir nur sehr schwer an individuelle Verhältnisse anpassen können.
Das Ergebnis ist total überladene, inperformante software mt grauenhafter Usability.
Das macht wirtschaftlich auf den ersten Blick Sinn, denn man spart bei der Entwicklung der Software sehr viel Geld. Leider bedenkt keiner, dass wenn ich bei der Entwicklung ein paar Millionen spare dann aber hunderte von Millionen verschwende weil meine Tausende von Angestellten die diese Software nutzen bei jedem Klick auf einen Button 30s nutzlos auf eine Reaktion warten, ich irgendwo einen Denkfehler habe...

Aber da werden wir beide uns sowieso nie einig werden. Du bist halt anders gepolt...
 

mrBrown

Super-Moderator
Mitarbeiter
Genau wie du sagst Wunschdenken. Also wünscht man sich das. Warum sollte man also nicht versuchen dem zumindest so nahe wie möglich zu kommen?
Oder anders gesagt, eine Sichtweise, die nichts mit Tatsachen zu tun hat.

Man kann ein paar Tausend Zeilen nicht mehr als einzelner im Detail überblicken - wohlgemerkt ein paar tausend Zeilen unter Nutzung eines Frameworks mit ein paar hunderttausend.

Oder wie stellst du dir das vor?

Statt dessen geht die aktuelle Entwicklung genau in die andere Richtung. Einfach weil es billiger in der Entwicklung ist. Das ist genau wie alles andere in der heutigen globalen Welt. Billig muss es sein. Nicht gut.
Modularisierung, Encapsulation und Information Hiding sind seit Jahrzehnten Grundprinzipen von Softwareentwicklung. Nicht weil sie billig sind, sondern weil sie gut sind.

Also schreiben wir Software indem wir Module zusammen klicken von denen wir nicht den Ansatz einer Ahnung haben was sie machen, von denen wir nur 10% brauchen und welche wir nur sehr schwer an individuelle Verhältnisse anpassen können.
Das Ergebnis ist total überladene, inperformante software mt grauenhafter Usability.
Schlechte Software hat nichts mit Modularisierung zu tun, eher das Gegenteil ist das Problem, sondern mit schlechten Entwicklern.

Das macht wirtschaftlich auf den ersten Blick Sinn, denn man spart bei der Entwicklung der Software sehr viel Geld. Leider bedenkt keiner, dass wenn ich bei der Entwicklung ein paar Millionen spare dann aber hunderte von Millionen verschwende weil meine Tausende von Angestellten die diese Software nutzen bei jedem Klick auf einen Button 30s nutzlos auf eine Reaktion warten, ich irgendwo einen Denkfehler habe...
Stattdessen lieber Software, die ein einzelner noch vollständig überblicken kann, die deshalb aber genau einen Knopf ohne Funktion hat, der aber immerhin schnell reagiert?
 

Thallius

Top Contributor
Oder anders gesagt, eine Sichtweise, die nichts mit Tatsachen zu tun hat.

Man kann ein paar Tausend Zeilen nicht mehr als einzelner im Detail überblicken - wohlgemerkt ein paar tausend Zeilen unter Nutzung eines Frameworks mit ein paar hunderttausend.

Oder wie stellst du dir das vor?


Modularisierung, Encapsulation und Information Hiding sind seit Jahrzehnten Grundprinzipen von Softwareentwicklung. Nicht weil sie billig sind, sondern weil sie gut sind.


Schlechte Software hat nichts mit Modularisierung zu tun, eher das Gegenteil ist das Problem, sondern mit schlechten Entwicklern.


Stattdessen lieber Software, die ein einzelner noch vollständig überblicken kann, die deshalb aber genau einen Knopf ohne Funktion hat, der aber immerhin schnell reagiert?

Wie ich schon sagte wir werden nie auf einen Nenner kommen. Solange ich aber überdurchschnittlich gut bezahlt werde für meine schlechte Software die nur einen Knopf ohne Funktion hat, diese aber Software ersetzt die von Leuten wie dir geschrieben wurden weil die User damit absolut unzufrieden sind, solange ist die Welt für mich noch in Ordnung. Und du darfst gerne auch weiter in deiner Welt programmieren denn du sorgst ja damit dafür dass ich immer neue Aufträge bekommen.

Achja und vielleicht sollte ich dafür einfach mal Danke sagen....
 

mrBrown

Super-Moderator
Mitarbeiter
Ernstgemeinte Frage: wie viele Zeilen kannst du noch im Detail überblicken und was für Programme werden das, für die du weder Framework noch Library nutzt?
 

Thallius

Top Contributor
Also mein aktuelles Projekt ist eine komplette wartungsplanungs Software im medizintechnschen Bereich für ganz Europa. Größenordnung weis ich gerade nicht aber gepackt sind die Sourcen ca. 35MB. Entwiclungszeit bisher ca. Ein halbes Mannjahr.

Geschrieben in JQuery als Frontend und PHP als Webservice für die Oracle DB ohne jegliches Framework.

Du kannst gerne mal vorbei kommen und dir die Software ansehen....
 

Flown

Administrator
Mitarbeiter
Kann mich da vielleicht einer von euch aufschlauen oder ist eurer Meinung nach das Verstehen von Lambdas nicht (so) wichtig?
Lambdas sind nichts weiter als Implementierungen von SAM-Interfaces (Single-abstract-method). Dies wird dann verwendet um den Boileplatecode zu verkleinern:
Java:
Runnable r = () -> doSomething();
//oder
Runnable r = this::doSomething;
//vs.
Runnable r = new Runnable() {
  public void run() {
    doSomething();
  }
}
Weiter gedacht ermöglicht es Verhalten (also Implementierungen) leichter und übersichtlicher zu übergeben (wie z.B. Stream-API). Was jetzt noch zusätzlich hinzukommt ist, dass die JVM jetzt auch under-the-hood Optimierungen durchführen kann (z.B. Objectpool, Inlining, etc.).

Um jetzt nochmal auf die Stream-API einzugehen: Diese ermöglicht dir einen Workflow zu erstellen, der dir sagt was gemacht wird und nicht wie es gemacht wird. Beispiel von oben:
Java:
List<Integer> ints = ...;
List<Integer> filtered = new ArrayList<>();
for (int i : ints) {
  if (i == 42) {
    filtered.add(i);
  }
}
Erläuterung: Hier wird explizit mit einer for-Schleife iteriert, eine Implementierung für List (eine ArrayList) angegeben und dieser Code lässt sich nur mit Mehraufwand parallelisieren.
Java:
List<Integer> filtered = ints.stream().filter(i -> i == 42).collect(Collectors.toList());
Erläuterung: Hier wird angegeben, dass es sich um einen Stream handelt, das alle Elemente auf ein bestimmtes Predikat getestet und dann in eine Liste gesammelt ird.
Das lest sich fast wie ein Satz und man kann einfach ein parallel() reinwerfen und schon passiert die Magie :).

Es gibt sehr viele Einsatzgebiete, wo Lambdas eingesetzt werden könnten, aber da das in der Sprache Java leider noch nicht so lange vorhanden ist, wird es noch eine Weile dauern, bis das Umdenken bei allen Frameworks und Entwickler angekommen ist.

Wie würdest du das ohne Lambdas umsetzen?
Java:
for(Iterator<Integer> iterator = ints.iterator(); iterator.hasNext();) {
  if (iterator.next() != 42) iterator.remove();
}
 

Bela B.

Aktives Mitglied
Danke schon mal an alle! Ich wollte damit jetzt übrigens keinen Glaubenskrieg auslösen;)

Habe erst kürzlich das Kapitel Lambdas im Buch "Der Weg zum Java-Profi" durchgearbeitet und da wurde mir jetzt nicht so klar, was daran so extrem toll sein soll.

Mit den ganzen Umwegen beim Exception-Handling erschien mir das irgendwie suspekt.

Bei der Liste macht das deutlich mehr Sinn. So 100% verstehen tue ich die Syntax allerdings noch nicht:oops:
Aus diesem Grund fällt es mir daher aktuell auch schwer, selbst Einsatzgebiete dafür zu finden, damit ich mir die Sache ein bisschen aneignen kann.
 

Flown

Administrator
Mitarbeiter
So 100% verstehen tue ich die Syntax allerdings noch nicht
Es ist ganz einfach:
Java:
i -> i == 42;
// <=>
(i) -> i == 42;
// <=>
(Integer i) -> i == 42;
// <=>
(Integer i) -> {
  return i == 42;
}
// <=>
new Predicate<Integer>() {
  @Override
  public boolean test(Integer i) {
    return i == 42;
  }
}
(Liste von Parameter) -> Statement
Parameter können mit Typ angeführt werden, einzelne Parameter können mit () umgeben werden.

Was du hier siehst sind alles äquivalente Ausprägungen und letzteres ware vorher der way-to-go.
 

MiMij

Bekanntes Mitglied
Was ich sehr praktisch finde bei den Lambdas ist vor allem der Gebrauch bei zb Listen
Java:
final List<XYZ> listConverted= new ArrayList<>();
allPrograms.forEach(program -> listConverted.add(convertList(program)));
oder sowas hier
Java:
Collections.sort(list, (a, b) -> b.compareTo(a));
statt
Java:
Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        return b.compareTo(a);
    }
})
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
F Hat es noch einen Sinn, alte Versionen zu lernen Java Basics - Anfänger-Themen 45
berserkerdq2 Wo ist der SInn, dass man den Stream, den ich zum Schreiben nutze, outputstream nenne? Java Basics - Anfänger-Themen 5
H Sinn von Interfaces Java Basics - Anfänger-Themen 21
W Sinn eines Singleton ? Java Basics - Anfänger-Themen 14
R getUserProperties() macht für mich keinen Sinn Java Basics - Anfänger-Themen 8
E Sinn: final in Parameterliste verwenden Java Basics - Anfänger-Themen 2
5 Welchen Sinn hat ein Runnable Java Basics - Anfänger-Themen 6
P OOP Sinn von abstrakten Klassen Java Basics - Anfänger-Themen 2
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
B Der Sinn von Arrays Java Basics - Anfänger-Themen 2
Q Container sinn? Java Basics - Anfänger-Themen 3
S string index out of range - es ergibt keinen Sinn Java Basics - Anfänger-Themen 6
C Sinn eines Interfaces? Java Basics - Anfänger-Themen 4
J Sinn/Nutzen von Scanner Java Basics - Anfänger-Themen 23
B Sinn von Reflections Java Basics - Anfänger-Themen 10
H Vererbung Prinzip der Ersetzbarkeit-Sinn? Java Basics - Anfänger-Themen 9
F Sinn der SuppressWarnings("unused")-Annotation Java Basics - Anfänger-Themen 5
R Sinn des programmes Java Basics - Anfänger-Themen 10
W Sinn von Konstruktorsyntax und finalize Java Basics - Anfänger-Themen 14
J Worin besteht der Sinn und Anwendungsbereich von Dreidimensionalen Arrays? Java Basics - Anfänger-Themen 11
J Datentypen Was ist der Sinn vom Datentyp "char" ? Java Basics - Anfänger-Themen 11
T Sinn von finally? Java Basics - Anfänger-Themen 3
M Variablen Zinseszinsberechnung - Variable ergibt keinen Sinn Java Basics - Anfänger-Themen 15
A Klassen Sinn des Konstruktors Java Basics - Anfänger-Themen 12
P Sinn des Security Managers Java Basics - Anfänger-Themen 2
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Sinn von Jar Dateien Java Basics - Anfänger-Themen 5
D Sinn von Interfaces - Wozu? Java Basics - Anfänger-Themen 9
K Sinn eigener Exceptions Java Basics - Anfänger-Themen 11
Luk10 Sinn von Instanzierung ohne Referenz Java Basics - Anfänger-Themen 7
hdi Sinn von RuntimeExceptions? Java Basics - Anfänger-Themen 90
Developer_X NullPointer Exception ohne Sinn Java Basics - Anfänger-Themen 19
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
M Der Java Schlüsselwort null; ?Welche Anweisung und Sinn? Java Basics - Anfänger-Themen 12
A Macht es Sinn Arraylisten mit Gettern zu übergeben? Java Basics - Anfänger-Themen 19
M Variable überwachen und Sinn eines Threads Java Basics - Anfänger-Themen 7
G Sinn vo OOP Java Basics - Anfänger-Themen 5
P Unterschied zwischen Interface und Vererbung und Sinn? Java Basics - Anfänger-Themen 5
G sinn von JList Java Basics - Anfänger-Themen 6
K Sinn von Interfaces Java Basics - Anfänger-Themen 10
N Lambdas, Methodenref, fkt Programmierung ? Java Basics - Anfänger-Themen 10
W for Schleife in allgemeingültiges Konstrukt aus Stream und Lambdas Java Basics - Anfänger-Themen 6
J Best Practice Debugging in Java8 Lambdas Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben