2017-01-30 4 views
4
String[] arr={"121","4545","45456464"}; 
Arrays.stream(arr).filter(s->s.length()>4).toArray(String[]::new); 

Может кто-нибудь сказать мне точно , что происходит сtoArray(String[]::new) в фрагменте кода выше.Использование фильтра в потоках

+3

Итак, это вопрос о 'filter' или about' toArray'? –

+1

Возможный дубликат [Как преобразовать поток Java 8 в массив?] (Http://stackoverflow.com/questions/23079003/how-to-convert-a-java-8-stream-to-an-array) –

ответ

3

The toArray создает String[], содержащий результат filter в вашем случае все строки, длина которых больше 4. filter возвращает Stream и поэтому вы преобразуя его в массив.

Для печати отфильтрованного результата, а не хранить его в массив

Arrays.stream(arr).filter(s -> s.length() > 4).forEach(System.out::println); 
+0

Как напечатать эту строку? –

+1

Вы имеете в виду вместо того, чтобы хранить его обратно в 'String []' или как печатать массив в целом. Я обновил ответ, чтобы показать, как вы можете распечатать поток. –

+0

Если значение хранится в String, как указано в вопросе, и какова ссылка на эту строку и как получить к ней доступ? –

5

String[]::new фактически такой же, как size -> new String[size]. Новый String[] создан с тем же размером, что и количество элементов после применения filter к Stream. См. Также javadoc от Stream.toArray

1

String[]::new является ссылкой на нового оператора String[]. Это синтаксис Java-8. toArray метод Streams принимает IntFunction<A[]> как генератор для массива, в котором будут собираться элементы потока. Это то же самое, что и написание:

Arrays.stream(arr).filter(s->s.length()>4).toArray(size-> { return new Integer[size]; });