it-swarm.com.ru

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

Какой самый простой/кратчайший способ преобразовать Java 8 Stream в массив?

682
user972946

Самый простой способ - использовать метод toArray(IntFunction<A[]> generator) со ссылкой на конструктор массива. Это предлагается в документация API для метода .

String[] stringArray = stringStream.toArray(String[]::new);

Что он делает, так это находит метод, который принимает целое число (размер) в качестве аргумента и возвращает String[], что именно то, что делает (одна из перегрузок) new String[].

Вы также можете написать свой собственный IntFunction:

Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);

Назначение IntFunction<A[]> generator - преобразовать целое число, размер массива, в новый массив.

Пример кода:

Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);

Печать:

a
b
c
1045
skiwi

Если вы хотите получить массив потоков со значениями от 1 до 10 из потока, в вашем распоряжении есть IntStream.

Здесь мы создаем Stream с помощью метода Stream.of и конвертируем Stream в IntStream, используя mapToInt. Затем мы можем вызвать метод toStray от IntStream.

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();

Здесь то же самое, без потока, используя только IntStream

int[]array2 =  IntStream.rangeClosed(1, 10).toArray();
36
Ida Bucić

Вы можете преобразовать поток Java 8 в массив с помощью этого простого блока кода:

 String[] myNewArray3 = myNewStream.toArray(String[]::new);

Но давайте объясним подробнее, во-первых, давайте создадим список строк, заполненный тремя значениями:

String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};

Создайте поток из данного массива:

Stream<String> stringStream = Arrays.stream(stringList);

теперь мы можем выполнить некоторые операции с этим потоком. Например:

Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());

и, наконец, преобразуйте его в массив Java 8, используя следующие методы:

1-классический метод (функциональный интерфейс)

IntFunction<String[]> intFunction = new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
};


String[] myNewArray = myNewStream.toArray(intFunction);

2-лямбда-выражение

 String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);

3- Ссылка на метод

String[] myNewArray3 = myNewStream.toArray(String[]::new);

Ссылка на метод Объяснение:

Это еще один способ написания лямбда-выражения, которое строго эквивалентно другому.

13
Bachiri Taoufiq Abderrahman

Преобразовать текст в строковый массив, где каждое значение разделяется запятой, и обрезать каждое поле, например:

String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
6
Danail Tsvetanov

Вы можете создать собственный коллектор, который преобразует поток в массив.

public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
    return Collectors.collectingAndThen( 
                  Collectors.toList(), 
                  list ->list.toArray( converter.apply( list.size() ) ) );
}

и быстрое использование

List<String> input = Arrays.asList( ..... );

String[] result = input.stream().
         .collect( CustomCollectors.**toArray**( String[]::new ) );
4
Thomas Pliakas

Использование метода toArray(IntFunction<A[]> generator) действительно является очень элегантным и безопасным способом преобразования (или, точнее, сбора) потока в массив того же типа, что и поток.

Однако, если тип возвращаемого массива не важен, простое использование метода toArray() проще и короче. Например:

    Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
    System.out.printf("%s, %s, %s!", args.toArray());
2
Kunda
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

int[] arr=   stream.mapToInt(x->x.intValue()).toArray();
0
Raj N