Ich wurde dies bei einem Interview gefragt und bin nicht überzeugt, dass ich die beste Antwort gegeben habe, die ich haben konnte. Ich erwähnte, dass Sie eine parallele Suche durchführen können und dass Nullwerte auf eine Weise behandelt wurden, an die ich mich nicht erinnern konnte. Jetzt merke ich, dass ich an Optionals gedacht habe. Was fehlt mir hier? Sie behaupten, es sei besser oder prägnanter, aber ich bin mir nicht sicher, ob ich damit einverstanden bin.
Wenn man bedenkt, wie prägnant es beantwortet wurde, scheint dies doch keine allzu weit gefasste Frage zu sein.
Wenn sie diese Frage in Interviews stellen und dies eindeutig sind, welchen Zweck könnte es haben, sie aufzuschlüsseln, außer es schwieriger zu machen, eine Antwort zu finden? Ich meine, wonach suchst du? Ich könnte die Frage aufschlüsseln und alle Unterfragen beantworten lassen, aber dann eine übergeordnete Frage mit Links zu allen Unterfragen erstellen ... scheint allerdings ziemlich dumm zu sein. Wenn wir schon dabei sind, geben Sie mir bitte ein Beispiel für eine weniger breite Frage. Ich kenne keine Möglichkeit, nur einen Teil dieser Frage zu stellen und trotzdem eine aussagekräftige Antwort zu erhalten. Ich könnte genau die gleiche Frage auf andere Weise stellen. Zum Beispiel könnte ich fragen: "Welchen Zweck erfüllen Streams?" oder "Wann würde ich einen Stream anstelle einer for-Schleife verwenden?" oder "Warum sich mit Streams anstatt mit for-Schleifen beschäftigen?" Dies sind jedoch alle genau die gleiche Frage.
... oder wird es als zu weit gefasst angesehen, weil jemand eine wirklich lange Mehrpunktantwort gegeben hat? Ehrlich gesagt kann jeder, der es weiß, das mit praktisch jeder Frage tun. Wenn Sie beispielsweise einer der Autoren der JVM sind, könnten Sie wahrscheinlich den ganzen Tag über für Schleifen sprechen, wenn die meisten von uns dies nicht konnten.
"Bitte bearbeiten Sie die Frage, um sie auf ein bestimmtes Problem mit genügend Details zu beschränken, um eine angemessene Antwort zu finden. Vermeiden Sie es, mehrere unterschiedliche Fragen gleichzeitig zu stellen. Weitere Informationen zur Klärung dieser Frage finden Sie auf der Seite" Wie man Fragen stellt "."
Wie unten erwähnt, wurde eine angemessene Antwort gegeben, die beweist, dass es eine gibt und dass es einfach genug ist, sie bereitzustellen.
quelle
Antworten:
Interessant, dass in der Interviewfrage nach den Vorteilen gefragt wird, ohne nach Nachteilen zu fragen, denn es gibt beides.
Streams sind deklarativer . Oder ein ausdrucksstärkerer Stil. Es kann als besser angesehen werden, Ihre Absicht im Code zu deklarieren, als zu beschreiben, wie es gemacht wird:
... sagt ganz klar, dass Sie übereinstimmende Elemente aus einer Liste filtern, während:
Sagt "Ich mache eine Schleife". Der Zweck der Schleife ist tiefer in der Logik vergraben.
Streams sind oft knapp . Das gleiche Beispiel zeigt dies. Terser ist nicht immer besser, aber wenn Sie gleichzeitig knapp und ausdrucksstark sein können, umso besser.
Streams haben eine starke Affinität zu Funktionen . Java 8 führt Lambdas und funktionale Schnittstellen ein, die eine ganze Reihe leistungsstarker Techniken öffnen. Streams bieten die bequemste und natürlichste Möglichkeit, Funktionen auf Objektsequenzen anzuwenden.
Streams fördern eine geringere Veränderlichkeit . Dies hängt in gewisser Weise mit dem Aspekt der funktionalen Programmierung zusammen. Die Art von Programmen, die Sie mit Streams schreiben, ist in der Regel die Art von Programmen, bei denen Sie keine Objekte ändern.
Streams fördern eine lockerere Kopplung . Ihr Stream-Handling-Code muss weder die Quelle des Streams noch dessen mögliche Beendigungsmethode kennen.
Streams können ein recht ausgefeiltes Verhalten prägnant ausdrücken . Beispielsweise:
Könnte auf den ersten Blick so aussehen, als würde der gesamte Stream gefiltert und dann das erste Element zurückgegeben. Tatsächlich wird jedoch
findFirst()
der gesamte Vorgang gesteuert, sodass er nach dem Auffinden eines Elements effizient gestoppt wird.Streams bieten Raum für zukünftige Effizienzgewinne . Einige Leute haben Benchmarking durchgeführt und festgestellt, dass Single-Threaded-Streams von In-Memory-
List
S oder Arrays langsamer sein können als die entsprechende Schleife. Dies ist plausibel, da mehr Objekte und Gemeinkosten im Spiel sind.Aber Streams skalieren. Neben der integrierten Unterstützung von Java für parallele Stream-Operationen gibt es einige Bibliotheken für die verteilte Kartenreduzierung, bei denen Streams als API verwendet werden, da das Modell passt.
Nachteile?
Leistung : Eine
for
Schleife durch ein Array ist sowohl hinsichtlich der Heap- als auch der CPU-Auslastung extrem leicht. Wenn rohe Geschwindigkeit und Sparsamkeit des Speichers Priorität haben, ist die Verwendung eines Streams schlechter.Vertrautheit. Die Welt ist voll von erfahrenen prozeduralen Programmierern mit vielen Sprachhintergründen, für die Schleifen bekannt und Streams neu sind. In einigen Umgebungen möchten Sie Code schreiben, der dieser Art von Person vertraut ist.
Kognitiver Overhead . Aufgrund seiner deklarativen Natur und der zunehmenden Abstraktion von dem, was darunter geschieht, müssen Sie möglicherweise ein neues mentales Modell erstellen, wie sich Code auf die Ausführung bezieht. Eigentlich müssen Sie dies nur tun, wenn etwas schief geht oder wenn Sie die Leistung oder subtile Fehler gründlich analysieren müssen. Wenn es "einfach funktioniert", funktioniert es einfach.
Debugger verbessern sich, aber selbst jetzt, wenn Sie in einem Debugger durch den Stream-Code gehen, kann dies schwieriger sein als die entsprechende Schleife, da eine einfache Schleife sehr nahe an den Variablen und Code-Positionen liegt, mit denen ein herkömmlicher Debugger arbeitet.
quelle
Abgesehen von dem syntaktischen Spaß sind Streams so konzipiert, dass sie mit potenziell unendlich großen Datenmengen arbeiten können, während Arrays, Sammlungen und fast jede Java SE-Klasse, die Iterable implementiert, vollständig im Speicher gespeichert sind.
Ein Nachteil eines Streams ist, dass Filter, Zuordnungen usw. keine aktivierten Ausnahmen auslösen können. Dies macht einen Stream zu einer schlechten Wahl für beispielsweise Zwischen-E / A-Operationen.
quelle
Stream<Row>
- oder es wäre möglich, eine eigeneStream
Implementierung zu schreiben , die DB-Ergebniscursoroperationen umschließt.Arrays.asList("test", null).stream().forEach(s -> System.out.println(s.length()));
Sie haben falsch erkannt: Paralleloperationen verwenden
Stream
s, nichtOptional
s.Sie können Methoden definieren, die mit Streams arbeiten: Nehmen Sie sie als Parameter, geben Sie sie zurück usw. Sie können keine Methode definieren, die eine Schleife als Parameter verwendet. Dies ermöglicht eine einmalige und mehrfache Verwendung eines komplizierten Stream-Vorgangs. Beachten Sie, dass Java hier einen Nachteil hat: Ihre Methoden müssen
someMethod(stream)
im Gegensatz zu den eigenen Methoden aufgerufen werden. Dasstream.someMethod()
Mischen dieser Methoden erschwert das Lesen: Versuchen Sie, die Reihenfolge der Operationen in anzuzeigenViele andere Sprachen (C #, Kotlin, Scala usw.) erlauben irgendeine Form von "Erweiterungsmethoden".
Selbst wenn Sie nur sequentielle Operationen benötigen und diese nicht wiederverwenden möchten, sodass Sie entweder Streams oder Schleifen verwenden können, können einfache Operationen an Streams recht komplexen Änderungen in den Schleifen entsprechen.
quelle
Optional
ist eine Alternative zunull
, hat aber nichts mit parallelen Operationen zu tun. Es sei denn "Jetzt ist mir klar, dass ich an Optionals gedacht habe" in Ihrer Frage geht es nur um dienull
Handhabung?Sie durchlaufen eine Sequenz (Array, Sammlung, Eingabe, ...), weil Sie eine Funktion auf die Elemente der Sequenz anwenden möchten.
Streams bieten Ihnen die Möglichkeit , Funktionen für Sequenzelemente zusammenzustellen und die gängigsten Funktionen (z. B. Zuordnung, Filterung, Suche, Sortierung, Sammlung usw.) unabhängig von einem konkreten Fall zu implementieren .
Daher können Sie bei einer Schleifenaufgabe in den meisten Fällen diese mit weniger Code mithilfe von Streams ausdrücken, dh Sie erhalten Lesbarkeit .
quelle
Ich würde sagen, seine Parallelisierung ist so einfach zu bedienen. Versuchen Sie, über Millionen von Einträgen parallel zu einer for-Schleife zu iterieren. Wir gehen zu vielen CPUs, nicht schneller; Je einfacher es ist, parallel zu laufen, desto besser und mit
Stream
s ist dies ein Kinderspiel.Was ich sehr mag, ist die Ausführlichkeit, die sie bieten. Es braucht wenig Zeit, um zu verstehen, was sie tatsächlich tun und produzieren, im Gegensatz dazu, wie sie es tun.
quelle