как преобразовать поток java 8 в массив?

<p>какой самый простой/кратчайший способ преобразовать java 8 <code>stream</code> в массив?</p>

<p>самый простой способ - использовать метод <code>toarray(intfunction<a[]> generator)</code> со ссылкой на конструктор массива. это предлагается в <a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/stream.html#toarray-java.util.function.intfunction-">документация api для метода</a> .</p><pre><code>string[] stringarray = stringstream.toarray(string[]::new); </code></pre><p>что он делает, так это находит метод, который принимает целое число (размер) в качестве аргумента и возвращает <code>string[]</code>, что именно то, что делает (одна из перегрузок) <code>new string[]</code>.</p><p>вы также можете написать свой собственный <code>intfunction</code>:</p><pre><code>stream<string> stringstream = ...; string[] stringarray = stringstream.toarray(size -> new string[size]); </code></pre><p>назначение <code>intfunction<a[]> generator</code> - преобразовать целое число, размер массива, в новый массив.</p><p>пример кода:</p><pre><code>stream<string> stringstream = stream.of("a", "b", "c"); string[] stringarray = stringstream.toarray(size -> new string[size]); arrays.stream(stringarray).foreach(system.out::println); </code></pre><p>печать:</p><pre><code>a b c </code></pre>

<p>если вы хотите получить массив потоков со значениями от 1 до 10 из потока, в вашем распоряжении есть intstream.</p><p>здесь мы создаем stream с помощью метода stream.of и конвертируем stream в intstream, используя maptoint. затем мы можем вызвать метод tostray от intstream.</p><pre><code>stream<integer> stream = stream.of(1,2,3,4,5,6,7,8,9,10); //or use this to create our stream //stream<integer> stream = intstream.rangeclosed(1, 10).boxed(); int[] array = stream.maptoint(x -> x).toarray(); </code></pre><p>здесь то же самое, без потока, используя только intstream</p><pre><code>int[]array2 = intstream.rangeclosed(1, 10).toarray(); </code></pre>

<p>вы можете преобразовать поток java 8 в массив с помощью этого простого блока кода:</p><pre><code> string[] mynewarray3 = mynewstream.toarray(string[]::new); </code></pre><p>но давайте объясним подробнее, во-первых, давайте создадим список строк, заполненный тремя значениями:</p><pre><code>string[] stringlist = {"bachiri","taoufiq","abderrahman"}; </code></pre><p>создайте поток из данного массива:</p><pre><code>stream<string> stringstream = arrays.stream(stringlist); </code></pre><p>теперь мы можем выполнить некоторые операции с этим потоком. например:</p><pre><code>stream<string> mynewstream = stringstream.map(s -> s.touppercase()); </code></pre><p>и, наконец, преобразуйте его в массив java 8, используя следующие методы:</p><p>1-классический метод (функциональный интерфейс)</p><pre><code>intfunction<string[]> intfunction = new intfunction<string[]>() { @override public string[] apply(int value) { return new string[value]; } }; string[] mynewarray = mynewstream.toarray(intfunction); </code></pre><p>2-лямбда-выражение</p><pre><code> string[] mynewarray2 = mynewstream.toarray(value -> new string[value]); </code></pre><p>3- ссылка на метод</p><pre><code>string[] mynewarray3 = mynewstream.toarray(string[]::new); </code></pre><p>ссылка на метод объяснение:</p><p>это еще один способ написания лямбда-выражения, которое строго эквивалентно другому.</p>

<p>преобразовать текст в строковый массив, где каждое значение разделяется запятой, и обрезать каждое поле, например:</p><pre><code>string[] stringarray = arrays.stream(line.split(",")).map(string::trim).toarray(string[]::new); </code></pre>

<p>вы можете создать собственный коллектор, который преобразует поток в массив.</p><pre><code>public static <t> collector<t, ?, t[]> toarray( intfunction<t[]> converter ) { return collectors.collectingandthen( collectors.tolist(), list ->list.toarray( converter.apply( list.size() ) ) ); } </code></pre><p>и быстрое использование</p><pre><code>list<string> input = arrays.aslist( ..... ); string[] result = input.stream(). .collect( customcollectors.**toarray**( string[]::new ) ); </code></pre>

<p>использование метода <code>toarray(intfunction<a[]> generator)</code> действительно является очень элегантным и безопасным способом преобразования (или, точнее, сбора) потока в массив того же типа, что и поток.</p><p>однако, если тип возвращаемого массива не важен, простое использование метода <code>toarray()</code> проще <em>и</em> короче. например:</p><pre><code> stream<object> args = stream.of(bigdecimal.one, "two", 3); system.out.printf("%s, %s, %s!", args.toarray()); </code></pre>

<pre><code>stream<integer> stream = stream.of(1, 2, 3, 4, 5, 6); int[] arr= stream.maptoint(x->x.intvalue()).toarray(); </code></pre>