Java-Interviewfragen (Serie) – Streams

Verwenden Sie immer noch for Schleifen? Vielleicht ist es Zeit für etwas Neues!

Davon gesprochen Funktionale Schnittstellen und Lambda-Ausdrückees ist nur richtig, dass wir unsere Serie fortsetzen, über die wir sprechen Ströme.

Eine weitere wichtige neue Funktion von Java 8 ist die Stream Funktionalität.

Sein umschließendes Paket java.util.stream enthält Klassen, die zum Verarbeiten von Folgen von Elementen verwendet werden.

Wie Sie wahrscheinlich aus den anderen Beiträgen bemerkt haben, rede ich nicht nur über Theorie.

Lassen Sie uns sie spielen sehen und verstehen, wie sie funktionieren. 🚀

Implementierung

💈 Die beste Analogie für Streams ist a pipe, so wird es tatsächlich an manchen Stellen bezeichnet. In diesem Rohr haben Sie elements kommen nach und nach.

🔵 Streams initialisieren

Es gibt mehrere Möglichkeiten, Streams zu erstellen und zu initialisieren.

🔹 Leerer Stream

Stream<Integer> emptyStream = Stream.empty();

Sie können einen leeren Stream erstellen, aber das macht nicht wirklich Sinn, außer Sie möchten einen erstellen Stream andersherum und es schlägt fehl, oder eine Bedingung ist falsch.

Sie können zum Beispiel einen Blick auf die werfen ofNullable Methode auf der Stream Klasse. Der zweite Teil spielt keine Rolle, hier sieht man, wie ein leerer Stream könnte verwendet werden.

public static<T> Stream<T> ofNullable(T t) {
        return t == null ? Stream.empty()
                         : StreamSupport.stream(new Streams.StreamBuilderImpl<>
}

Stream.java

🔹 Stream.builder()

Stream<Integer> streamUsingBuilder = Stream.<Integer>builder()
                .add(1234)
                .build();

Der Builder-Ansatz kann nützlich sein, wenn Sie dem Stream in verschiedenen Phasen der Anwendung unterschiedliche Werte hinzufügen möchten.

🔹 Stream.of()

Stream<Integer> stringStream = Stream.of(1, 2, 3, 4, 5);

Sie können den Stream auch inline initialisieren, indem Sie die statische of Methode.

🔹 Arrays.stream()

Sie können einen Stream aus einem Array erstellen, indem Sie die verwenden java.util.Arrays Klasse.

Integer[] intArray = new Integer[] {1,2,3,4,5};
        
Stream<Integer> intStream = Arrays.stream(intArray);

🔹 Sammlungen.stream()

Das Collection Schnittstelle erhielt eine neue Methode, um mit den neu hinzugefügten zu interagieren Stream Klasse.

Aus diesem Grund kann jedes Objekt, das diese Schnittstelle implementiert, mithilfe von in einen Stream umgewandelt werden stream() Methode.

List<Integer> intList = new ArrayList<>();
Stream<Integer> intStreamFromList = intList.stream();
Set<Integer> intSet = new HashSet<>();
Stream<Integer> intStreamFromSet = intSet.stream();

Einmal erstellt, die Instanz wird seine Quelle nicht ändern, wodurch die Erstellung mehrerer Streams aus einer einzigen Quelle ermöglicht wird.

Wir haben gesehen, wie wir einen Stream initialisieren können, lassen Sie uns jetzt mit den Elementen herumspielen.

Weitere Beiträge wie diesen finden Sie auf new-spike.net

Während sie sich in der Pipe befinden, können Sie:

🔸 ihren Zustand ändern

Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stringStream = integerStream.map(val -> "Element: " + val); // Element: 1, Element: 2, Element: 3, Element: 4, Element: 5
Stream<Stream<Integer>> streamOfStreams = Stream.of(Stream.of(1), Stream.of(2,3), Stream.of(4,5,6));
Stream<String> integerStreams = streamsOfStreams.flatMap(val -> "Element: " + val); // Element: 1, Element: 2, Element: 3, Element: 4, Element: 5, Element: 6

🔸 einige davon herausfiltern

Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
integerStream.filter(val -> val%2 == 0); // 2, 4

🔸 einige Elemente überspringen

Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
integerStream.skip(4) // 5

🔸 Sortieren Sie die Elemente

Stream<Integer> integerStream = Stream.of(3, 2, 1, 4, 5);
integerStream.sorted(); // 1, 2, 3, 4, 5

🔸 Nebenwirkungen anwenden

Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
integerStream.peek(val -> System.out.println("Element: " + val)); // Element: 1, Element: 2, Element: 3, Element: 4, Element: 5

🔵 Terminalbetrieb

Am Ende des Rohres können Sie:

🔸 Sammeln Sie die Elemente in einem anderen Datensatz

Stream<Integer> integerStream = Stream.of(1, 2, 1, 2, 1);        
integerStream.collect(Collectors.toSet()); // 1, 2

🔸 gibt ein einzelnes Ergebnis zurück

Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Integer sum = integerStream.reduce(0, (a, b) -> a+b); // 15
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Optional<Integer> result = integerStream.findFirst(); // Optional.of(1)

🔸 Rückgabe ungültig

Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
integerStream.forEach(val -> System.out.println("Element: " + val)); // Element: 1, Element: 2, Element: 3, Element: 4, Element: 5

❗️In einem Stream sind die Zwischenoperationen „faul“.

Sie können so viele auf einen Stream anwenden, wie Sie möchten, aber bis Sie einen anwenden Terminalbetrieb die mittleren werden nicht aufgerufen.

Der Grund dafür ist ganz einfach, Sie müssen keine Ressourcen zuweisen und verbrauchen, bis Sie das Ergebnis tatsächlich benötigen.

Weitere Beiträge wie diesen finden Sie auf new-spike.net

🔵 Schließen von Streams

Streams implementieren die AutoCloseable Schnittstelle, das heißt, sie implementieren die close() Methode.

❗️ Du solltest vorsichtig sein, wenn du einen Stream schließt, denn sobald er geschlossen ist, wird er einen werfen IllegalStateException wenn Sie versuchen, es erneut zu operieren.

Normalerweise müssen Sie die Streams nicht schließen, da ihre Quellen es sind collections oder arrays die kein spezielles Ressourcenmanagement erfordern.

❗️Eine Ausnahme könnte sein, wenn Sie am operieren IO Ressourcen, wie das Streamen der Zeilen von a File. Dieser Anwendungsfall erfordert das Schließen des Streams. ❗️

✅ Um es am saubersten zu machen, solltest du den Stream in a öffnen try-with-resources -Block, der automatisch das Schließen des Streams übernimmt, nachdem alle Vorgänge abgeschlossen sind.

Verpassen Sie keine weiteren Beiträge wie diesen! Abonnieren Sie unseren kostenlosen Newsletter!

Derzeit arbeite ich an einer Java-Interview E-Book, das entwickelt wurde, um Sie erfolgreich durch jedes technische Java-Interview zu führen, das Sie möglicherweise führen.
Bleib dran! 🚀

Weitere Beiträge wie diesen finden Sie auf new-spike.net

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *