2016-05-16 2 views
6

В ответе this уже ответили, что оба выражения равны, но в этом случае они дают разные результаты. Для данной int[] scores, почему это работает:Arrays.stream (array) vs Arrays.asList (array) .stream()

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

... но это не делает:

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

Насколько я знаю .stream() можно назвать любой коллекции, в которой перечислены определенно. Второй фрагмент кода просто возвращает поток, содержащий массив как целое, а не элементы.

ответ

13

Поведение, которое вы видите, не относится к Stream s. Arrays.asList(scores) возвращает List<int[]>, когда вы передаете ему int[], поскольку параметр типового типа не может быть заменен примитивным типом. Поэтому, когда вы вызываете asList(T... a), компилятор использует int[] вместо T.

Если изменить scores к Integer[], вы получите вывод, который вы ожидаете (т.е. Arrays.asList(scores) возвратит List<Integer>).

+0

я вижу. Это просто странно, потому что я помню, как я делал такие вещи в прошлом, и это сработало. Будет ли это работать, если я заранее объявил Список следующим образом: «Список scoresAsList = новый ArrayList <> (score);'? – AdHominem

+3

@AdHominem Это не сработает, поскольку вы не можете передать массив конструктору 'ArrayList'. Вы можете передавать только коллекцию. – Eran

+0

В качестве побочного примечания 'Stream.of (score) .forEach (System.out :: println);' делает то же самое, что и 'Arrays.asList (score) .stream(). ForEach (System.out :: println); '... – Holger

7

Причина, по которой второй фрагмент кода не работает, заключается в том, что в Java нет такой вещи, как List<int>. Вот почему Arrays.asList(scores) не производит то, что вы ожидаете.

Переключение с int[] на Integer[] устранит эту проблему в том смысле, что две части кода приведут к идентичным результатам. Однако ваш код будет менее эффективным, потому что все int s будут в коробке.

Фактически, эффективность является причиной наличия перегрузок stream для примитивных массивов. Ваш звонок Arrays.stream(scores) направляется в stream(int[] array), производя IntStream объект. Теперь вы можете применить .forEach(System.out::println), который вызывает println(int), снова избегая бокса.

+1

Молитесь за проект Valhalla, а затем: D –

+0

@ java8.being: так как запись обертки' List' для 'int []' составляет примерно десять строк кода и для потоковой передачи, 'Arrays. stream (score) 'уже работает, я не вижу смысла молиться за что-то, о котором мы даже не знаем, что и как оно изменится по этой проблеме ... – Holger

+0

@Holger Я имел в виду эту строку:« Причина, по которой второй фрагмент кода не работает, так это то, что в Java нет такой вещи, как Список . ' –

0

Arrays.asList ожидает, что массивы объект не массивы примитивов. Он не жалуется на время компиляции, потому что массивы примитива являются объектом.

Это может быть один объект как список, но то, что находится внутри этого объекта объект (массивы примитива - объект) не может быть преобразован в список.

Массивы примитив может быть преобразовать в поток с помощью IntStream, DoubleStream и LongStream

как этот

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

Что случилось с моим ответом? Это, по крайней мере, вы должны прокомментировать. –

+0

Он уверен, помогает, как int [] оценка может быть преобразована в поток. –

+0

гораздо лучше сейчас +1 – Hulk