2014-04-11 7 views
12

Während um mit Java8 der Streams-API spielen, stolperte ich über die folgenden:Mit Streams mit Primitive Datentypen und die entsprechenden Wrapper

Um ein Array von primitiven Wrapper classe zu konvertieren Objekte in einem Stream Ich muss nur Stream.of(array) nennen. Aber um ein Array von primitiven Datentypen zu konvertieren, muss ich .of(array) von der entsprechenden Wrapper (Klasse) Stream-Klasse (< - das klingt albern) aufrufen.

Ein Beispiel:

final Integer[] integers = {1, 2, 3}; 
final int[]  ints  = {1, 2, 3}; 


Stream.of(integers).forEach(System.out::println); //That works just fine 

Stream.of(ints).forEach(System.out::println);  //That doesn't 

IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead 


Meine Frage (n): Warum ist das? Entspricht dies z.B. das Verhalten von Arrays.asList(), die auch nur für Wrapper-Klasse-Arrays funktioniert?

+3

Ist es nicht normal IntStream Methoden zu verwenden, mit IntStreams und Stream-Methoden mit Streams umgehen umgehen? –

+2

Sie können auch 'Arrays.stream (ints) .forEach (System.out :: println)' verwenden. – skiwi

+0

@skiwi Das ist wirklich nett zu wissen. Danke – ifloop

Antwort

15

Java 8 Stream Framework verfügt über eine generische Stream<T> für Objekte als Elemente und drei primitive Ströme IntStream, LongStream, DoubleStream für die wichtigsten drei Primitiven. Wenn Sie mit Primitiven arbeiten, verwenden Sie einen dieser letzteren, in Ihrem Fall IntStream.

Siehe Bild:

enter image description here

Was dahinter steckt, ist, dass:

  1. Java generics kann nicht mit primitiven Typen arbeiten: es ist nur möglich, List<Integer> und Stream<Integer>, haben aber nicht List<int> und Stream<int>

  2. Wenn der Java Collections Rahmen eingeführt wurde, war es nur für die Klassen eingeführt, wenn Sie also ein List von int s haben wollen, müssen Sie sie auf Integer s wickeln. Das ist teuer!

  3. Wenn der Java Streams Rahmen eingeführt wurde, beschlossen sie, um diesen Overhead und parallel mit den „klassenorientiert“ Ströme (mit dem Generika-Mechanismus) zu bekommen, führten sie drei zusätzliche Sätze aller Bibliotheksfunktionen, speziell für die wichtigsten Grundtypen entwickelt: int, long, double.

Und auch eine wunderbare Erklärung hier: https://stackoverflow.com/a/22919112/2886891

Verwandte Themen