2016-05-16 14 views
6

W this pytanie zostało już odpowiedział, że oba wyrażenia są równe, ale w tym przypadku są różne wyniki. Dla danego int[] scores, dlaczego to działa:Arrays.stream (array) vs Arrays.asList (tablica) .stream()

Arrays.stream(scores) 
     .forEach(System.out::println); 

... ale tego nie robi:

Arrays.asList(scores).stream() 
     .forEach(System.out::println); 

O ile wiem .stream() można wywołać na każdej kolekcji, która wymienia na pewno są. Drugi fragment kodu zwraca po prostu strumień zawierający tablicę jako całość zamiast elementów.

Odpowiedz

13

Zachowanie widać nie jest specyficzna dla Stream s. Arrays.asList(scores) Zwraca List<int[]> kiedy przechodzi on int[], ponieważ ogólny parametr typu nie może być zastąpiony przez prymitywnego typu. Dlatego też, wywołując asList(T... a), kompilator używa int[] zamiast T.

Jeżeli zmienisz scores do Integer[], dostaniesz wyjście można oczekiwać (tj Arrays.asList(scores) zwróci List<Integer>).

+0

widzę. To po prostu dziwne, ponieważ pamiętam, jak robiłem takie rzeczy w przeszłości i to działało. Czy zadziałałoby, gdybym wcześniej zadeklarował List: "Lista scoresAsList = new ArrayList <> (score);'? – AdHominem

+3

@AdHominem To by nie działało, ponieważ nie możesz przekazać tablicy do konstruktora 'ArrayList'. Możesz tylko przekazać kolekcję. – Eran

+0

Na marginesie, 'Stream.of (zdobywa) .forEach (System.out :: println);' robi to samo co 'Arrays.asList (wyniki) .stream() foreach (systemu..out :: println); '... – Holger

7

Powód drugi fragment kodu nie działa jest to, że nie ma czegoś takiego jak List<int> w Javie. Dlatego Arrays.asList(scores) nie daje tego, czego się spodziewasz.

Zmiana z int[] na Integer[] rozwiązałaby ten problem w tym sensie, że dwa fragmenty kodu dawałyby identyczne wyniki. Jednak Twój kod byłby mniej wydajny, ponieważ wszystkie byłyby w pudełku.

W rzeczywistości, wydajność jest powodem konieczności przeciążeniem stream dla prymitywnych tablic. Twój numer Arrays.stream(scores) jest kierowany do stream(int[] array), tworząc obiekt IntStream. Teraz możesz zastosować .forEach(System.out::println), która wywołuje println(int), ponownie unikając boksowania.

+1

Módlcie się za projekt Valhalla, następnie: D –

+0

@ java8.being: od pisania wrappera' List' dla 'int []' to mniej więcej dziesięć linii kodu, a do przesyłania strumieniowego 'Tablice. stream (score) 'już działa, nie widzę sensu modlitwy o coś, o czym nawet nie wiemy co i jak to się zmieni w tej kwestii ... – Holger

+0

@Holger Miałem na myśli dla tej linii:' Powód, dla którego Drugi fragment kodu nie działa, ponieważ nie ma czegoś takiego jak lista w języku Java. " –

0

Arrays.asList oczekuje tablice obiekt nie tablice pierwotnych. Nie narzeka na czas kompilacji, ponieważ tablica prymitywu jest obiektem.

To może potrwać jeden obiekt jako Lista ale co w środku, że obiektów (tablic prymitywny to obiekt) nie można przekonwertować do listy.

Tablice prymitywny można konwertować do przesyłania za pomocą IntStream, DoubleStream i LongStream

jak ten

double[] doubleArray = {1.1,1.2,1.3}; 

DoubleStream.of(doubleArray).forEach(System.out::println); 


int[] intArray = {1,2,3,4,5,6}; 

IntStream.of(intArray).forEach(System.out::println); 


long[] longArray = {1L,2L,3L}; 

LongStream.of(longArray).forEach(System.out::println); 
+0

Co jest nie tak z moją odpowiedzią? To przynajmniej powinieneś skomentować. –

+0

To na pewno pomaga, w jaki sposób można przekonwertować wynik int [] na strumień. –

+0

znacznie lepiej teraz +1 – Hulk