Как преобразовать поток Java 8 в массив?
каков самый простой / короткий способ преобразования Java 8 Stream
в массив?
9 ответов
самый простой способ-использовать 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
преобразовать an integer, размер массива, для нового массива.
пример кода:
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
Если вы хотите получить массив ints со значениями от 1 до 10 из потока, в вашем распоряжении есть IntStream.
здесь мы создаем поток с потоком.метода и преобразовать поток в IntStream с помощью mapToInt. Затем мы можем вызвать метод toArray 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();
вы можете преобразовать поток java 8 в массив, используя этот простой блок кода:
String[] myNewArray3 = myNewStream.toArray(String[]::new);
но давайте подробнее объясним, во-первых, давайте создадим список строк, заполненных тремя значениями:
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};
создать поток из заданного массива :
Stream<String> stringStream = Arrays.stream(stringList);
теперь мы можем выполнить некоторые операции над этим потоком Ex:
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);
способ пояснения:
это еще один способ написания лямбда-выражения, которое строго эквивалентно другому.
Вы можете создать пользовательский коллектор, который преобразует поток в массив.
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 ) );
С помощью toArray(IntFunction<A[]> generator)
метод действительно очень элегантный и безопасный способ преобразования (или, точнее, сбора) потока в массив того же типа потока.
однако, если тип возвращаемого массива не важен, просто используйте toArray()
способ проще и короче.
Например:
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
преобразовать текст в строковый массив, разделяя каждое значение запятой, и обрезать каждое поле, например:
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Integer[] integers = stream.toArray(it->new Integer[it]);
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
int[] arr= stream.mapToInt(x->x.intValue()).toArray();
вы можете сделать это несколькими способами.Все способы технически одинаковы, но использование лямбда упростило бы часть кода. Допустим, мы сначала инициализируем список с помощью String, назовем его persons.
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();
вы можете использовать любой из следующих способов.
1.Используя функцию toArray () интерфейса Stream, которая возвращает объект [], а затем бросает его в строку[].
String[] stringArray = (String [])stream.toArray();
2.Используя лямбда Expresiion для создания нового StringArray с определенными размер.
String[] stringArray = stream.toArray(size->new String[size]);
3. Использование ссылки на метод напрямую.
String[] stringArray = stream.toArray(String[]::new);