2017-02-05 1 views
2

Почему метод toString не может быть разрешен при использовании Arrays.stream() или IntStream:Вызов карты (массивы :: toString) в потоке, созданный Java Stream.of() против IntStream vs. Arrays.stream()

int row[] = ... 
Arrays.stream(row) 
     .map(Arrays::toString) 
     .forEach(System.out::println); 

Но, с другой стороны, она может быть решена, когда я использую Stream.of():

int row[] = ... 
Stream.of(row) 
     .map(Arrays::toString) 
     .forEach(System.out::println); 

ответ

5

Stream.of(row) будет возвращать Stream<int[]>, единственным элементом является row массив. Arrays содержит статический метод toString, который принимает int[], поэтому ваш второй фрагмент передает компиляцию.

С другой стороны, Arrays.stream(row) (а также IntStream.of(row)) возвращает IntStream, элементами которого являются int. Нет метода toString в классе Arrays, который принимает аргумент int.

Вы можете использовать statictoString метод Integer «s вместо:

Arrays.stream(row) 
     .mapToObj(Integer::toString) 
     .forEach(System.out::println); 

Заметьте, что вы должны вызывать mapToObj и не map, когда вы отображения примитива int к ссылочного типа.

+0

спасибо за разъяснение – Arashigor

+2

@Ervan, достаточно вызвать 'boxed' на' IntSteam', чтобы преобразовать примитив в оболочку. И нам действительно не нужно это преобразование, чтобы просто печатать отдельные элементы массива. 'Arrays.stream (row) .forEach (System.out :: println);' будет работать также. –

+1

@AntonBalaniuc Это правда. – Eran

Смежные вопросы