Java-Stream-Unterschied zwischen map und mapToObj

Lesezeit: 3 Minuten

Benutzeravatar von masterofdisaster
Herr der Katastrophe

Ich spüre keinen Unterschied zwischen map() und mapToObj() Methoden in Java 8 Streams. In beiden können wir Objekte erstellen und an die Streams zurückgeben, also warum existieren diese Methoden als zwei, nicht nur als eine.

Können Sie mir die Erklärung anhand von Beispielen geben?

  • Sie existieren nur an den primitiven Strömen, wo map funktioniert für die Abbildung des primitiven Typs auf sich selbst, z IntStream.map(IntOperator).

    – Louis Wassermann

    14. Dezember 2017 um 7:10 Uhr

Sie werden dieses coole Muster sehen. Das Stream Klassen beinhaltet a IntStream, LongStream, DoubleStream usw. Dies ist so, dass Sie primitive Typen in Stream-Operationen verwenden können. Denn sonst muss man verwenden Stream<Integer> oder Stream<Double>wodurch die Werte eingerahmt werden.

Ebenso die map Methoden tun dies auch. In dem Stream<T> Klasse, es gibt mapToInt, mapToDouble Methoden, aber die Situation ist ein wenig anders in der IntStream, DoubleStream Klassen.

Im IntStreamdas map Methode dauert ein IntUnaryOperator, das ein int auf ein int abbildet. Wenn Sie den Stream einem zuordnen möchten Stream<T>müssen Sie verwenden mapToObj. mapToObj ist ein guter Name, weil er sich von der unterscheidet map das auf ints abgebildet wird. Es bedeutet, dass sich der Strom von a ändert IntStream zu einem Stream<T>. Der Grund warum mapToObj so heißt, ist der gleiche Grund warum mapToInt wird so benannt – um eine Änderung in der zu bezeichnen Stream Typ/

  • Sie könnten eine Erwähnung hinzufügen boxed() Methode, die zwischen zB überträgt IntStream und Stream<Integer> und passt in dieses Muster.

    – daniu

    14. Dezember 2017 um 8:36 Uhr

Benutzeravatar von Alex Mamo
Alex Mamo

Die primitiven und Objektversionen von Datentypen (z int und Integer, double und Double, usw.) sind in Java nicht wirklich miteinander kompatibel. Sie werden durch den zusätzlichen Schritt kompatibel gemacht Auto-Boxing/Unboxing. Wenn Sie also einen Strom primitiver Ints haben und versuchen, die Objektversionen von zu verwenden Stream und Function (dh Stream<Integer> und Function<Integer, Integer>), entstehen Ihnen die Kosten für das Ein- und Auspacken der Elemente.

Um dieses Problem zu beseitigen, enthält das Funktionspaket primitive spezialisierte Versionen von Streams sowie funktionale Schnittstellen. Zum Beispiel anstatt zu verwenden Stream<Integer>du solltest benutzen IntStream. Sie können jetzt jedes Element des Streams mit verarbeiten IntFunction. Dadurch wird das automatische Boxen/Unboxen vollständig vermieden.

Wann immer Sie also Streams primitiver Elemente verarbeiten möchten, sollten Sie die primitiven spezialisierten Streams (d. h IntStream, LongStreamund DoubleStream) und primitive spezialisierte funktionale Schnittstellen (dh IntFunction, IntConsumer, IntSupplierusw.), um eine bessere Leistung zu erzielen.

Eine weitere Sache, die zu beachten ist, ist, dass keine der primitiven spezialisierten funktionalen Schnittstellen (wie z IntFunction, DoubleFunctionoder IntConsumer) erweitern die nicht-primitiven funktionalen Schnittstellen (dh Function, Consumerusw).

java.util.function package enthält int, doubleund long (aber nein float) Versionen aller funktionalen Schnittstellen. Beispielsweise gibt es eine IntFunctioneine DoubleFunction und a LongFunctionwelche sind int, doubleund long, Versionen von Function. Diese Funktionen werden zusammen mit primitiven spezialisierten Versionen von Streams wie verwendet IntStream, DoubleStreamund LongStream.

Nehmen wir einige Beispiele:

Stream<Object> stream1 = Stream.of(1, 2, 3); //Will compile fine
IntStream intStream1 = IntStream.of(4, 5, 6); //Will compile fine

Stream<Object> stream2 = IntStream.of(4, 5, 6); //Does not compile
Stream<Object> stream3 = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed
IntStream intStream2 = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed

Als Fazit der Grund, den Sie verwenden könnten mapToObj ist das gleiche, das Sie verwenden könnten mapToIntwas die ändern soll Stream Typ.

1431070cookie-checkJava-Stream-Unterschied zwischen map und mapToObj

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy