В настоящее время всякий раз, когда мне нужно создать поток из массива, я делаю
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Есть ли какой-нибудь прямой способ создать поток из массива?
источник
В настоящее время всякий раз, когда мне нужно создать поток из массива, я делаю
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Есть ли какой-нибудь прямой способ создать поток из массива?
Вы можете использовать Arrays.stream Например
Arrays.stream(array);
Вы также можете использовать Stream.of
как упомянуто @fge, который выглядит как
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Но note Stream.of(intArray)
вернет, Stream<int[]>
тогда как Arrays.stream(intArr)
вернёт, IntStream
если вы передадите массив типа int[]
. Таким образом, в двух словах для типа примитивов вы можете увидеть разницу между двумя методами, например
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Когда вы передаете массив примитивов Arrays.stream
, вызывается следующий код
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
и когда вы передаете примитивный массив Stream.of
в следующий код вызывается
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Следовательно, вы получите разные результаты.
Обновлено : как отмечалось в комментарии Стюарта Маркса Перегрузка поддиапазона Arrays.stream
предпочтительнее, чем использование, Stream.of(array).skip(n).limit(m)
поскольку первое приводит к потоку SIZED, а второе - нет. Причина в том, что limit(m)
он не знает, является ли размер m или меньше m, в то время Arrays.stream
как диапазон проверяет и знает точный размер потока. Вы можете прочитать исходный код для реализации потока, возвращаемой Arrays.stream(array,start,end)
здесь , тогда как для реализации потока, возвращенной Stream.of(array).skip().limit()
is в рамках этого метода .
Arrays.stream
имеет все перегруженные случаи для примитивных массивов. Т.е.Stream.of(new int[]{1,2,3})
даст вам какое-Stream<int[]>
то время, аArrays.stream
вернет вам то,IntStream
что, вероятно, вы хотите. Так что +1Stream.of
может преподнести вам некоторые сюрпризы (например, когда вы звонитеArrays.asList
с примитивным массивом и что люди ожидаютList<Integer>
Arrays.stream
поддерживает потоковый диапазон массива, которыйIntStream.of
не поддерживает. Напротив,Stream.of
это лучший выбор, если вы хотите иметьStream<int[]>
размер1
...Arrays.stream
предпочтительнее, чем использование,Stream.of(array).skip(n).limit(m)
поскольку первое приводит к потоку SIZED, а второе - нет. Причина в том, чтоlimit(m)
он не знает, является ли размерm
меньше или меньшеm
, аArrays.stream
диапазон проверяет и знает точный размер потока.Arrays.stream(array,start,end)
возвращает aStream
, реализация которого находится здесь , тогда какStream.of(array).skip().limit()
возвращает aStream
, реализация которого находится внутри этого метода .Альтернатива решению @ sol4me:
Разница между этим и
Arrays.stream()
: имеет значение, если ваш массив имеет примитивный тип. Например, если вы делаете:где
someArray
этоlong[]
, он будет возвращатьLongStream
.Stream.of()
с другой стороны, вернет aStream<long[]>
с одним элементом.источник
Arrays.stream()
работает и для этого*Stream.of()
когда у вас естьArrays.stream()
при работе с примитивными массивами. А что касается массивов, не являющихся реальными объектами, ну, это Java, так было с 1.0, так что разберитесь с этим; размышлять над этим ничего не помогаетArrays.stream()
не удобно, я считаю, что это удобно. Достаточно сказано.*Stream.of()
более удобным, чтобы быть ошибочным; потому что это вопрос предпочтений . Я предпочитаюArrays.stream()
для таких случаев, что делает его неправильным как общее правило,Stream.of()
которое более удобно (алгебра Пеано).Или, если у вас уже есть массив, вы также можете сделать
Для примитивных типов используйте
IntStream.of
илиLongStream.of
т. Д.источник
int[]
метод может быть передан методу, принимающему varargs, почему бы неStream.of(intArray)
создатьStream<Integer>
вместоStream<int[]>
? Кроме того, существуют ли технические причины, по которым существуют специализированные классы Stream для примитивов?int[]
не похож на другие массивы. Это не подклассObject[]
, но это подклассObject
. Итак, когда вы передаете егоStream.of
, он принимается какObject
параметр, и вы получаете потокint[]
. Это одна из причин иметь специализированные классы для примитивов - если бы вы не создавали потоки из примитивных массивов, это было бы довольно болезненно. Другая причина в том, что специализированные классы более эффективны, потому что им не нужно брать на себяObject
накладные расходы из бокса (преобразованиеint
в,Integer
чтобы они выглядели как обычные объекты).int[]
как этоObject
, он будет соответствовать перегруженному методуof(T t)
и, следовательно, он возвращаетStream<int[]>
. Итак, теоретически, если бы этот метод не был доступен, мы бы получилиStream<Integer>
взамен? или, возможно, это приводит к ошибке компиляции, потому что он не может найти подходящий метод? то естьint[]
не может рассматриваться какT...
Stream<Integer>
, потомуStream.of(t ... T)
что все равно подходили бы так же.Вы можете сделать это также методом низкого уровня, который имеет параллельную опцию:
Обновление: используйте полную array.length (не length - 1).
источник
Вы можете использовать Arrays.stream:
Это гарантирует возвращаемый тип steam на основе вашего типа ввода массива, если
String []
затем returnStream<String>
, еслиint []
затем возвращаетIntStream
Если вы уже знаете массив типов ввода, тогда лучше использовать определенный тип, например, для типа ввода
int[]
Это возвращает Intstream.
В первом примере Java использует метод
overloading
для поиска конкретного метода на основе типов ввода, в то время как во втором вы уже знаете тип ввода и вызываете конкретный метод.источник
редко видел, но это самый прямой путь
источник