Ответы:
Вы можете использовать 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 в рамках этого метода .
Stream.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)
возвращает a Stream
, реализация которого находится здесь , тогда как Stream.of(array).skip().limit()
возвращает a Stream
, реализация которого находится внутри этого метода .
Альтернатива решению @ sol4me:
Stream.of(theArray)
Разница между этим и Arrays.stream()
: имеет значение, если ваш массив имеет примитивный тип. Например, если вы делаете:
Arrays.stream(someArray)
где someArray
это long[]
, он будет возвращать LongStream
. Stream.of()
с другой стороны, вернет a Stream<long[]>
с одним элементом.
Arrays.stream()
работает и для этого
*Stream.of()
когда у вас есть Arrays.stream()
при работе с примитивными массивами. А что касается массивов, не являющихся реальными объектами, ну, это Java, так было с 1.0, так что разберитесь с этим; размышлять над этим ничего не помогает
Arrays.stream()
не удобно, я считаю, что это удобно. Достаточно сказано.
*Stream.of()
более удобным, чтобы быть ошибочным; потому что это вопрос предпочтений . Я предпочитаю Arrays.stream()
для таких случаев, что делает его неправильным как общее правило, Stream.of()
которое более удобно (алгебра Пеано).
Stream.of("foo", "bar", "baz")
Или, если у вас уже есть массив, вы также можете сделать
Stream.of(array)
Для примитивных типов используйте 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)
что все равно подходили бы так же.
Вы можете сделать это также методом низкого уровня, который имеет параллельную опцию:
/**
* Creates a new sequential or parallel {@code Stream} from a
* {@code Spliterator}.
*
* <p>The spliterator is only traversed, split, or queried for estimated
* size after the terminal operation of the stream pipeline commences.
*
* @param <T> the type of stream elements
* @param spliterator a {@code Spliterator} describing the stream elements
* @param parallel if {@code true} then the returned stream is a parallel
* stream; if {@code false} the returned stream is a sequential
* stream.
* @return a new sequential or parallel {@code Stream}
*
* <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
*/
StreamSupport.stream(Arrays.spliterator(array, 0, array.length), true)
Вы можете использовать Arrays.stream:
Arrays.stream (массив);
Это гарантирует возвращаемый тип steam на основе вашего типа ввода массива, если String []
затем return Stream<String>
, если int []
затем возвращаетIntStream
Если вы уже знаете массив типов ввода, тогда лучше использовать определенный тип, например, для типа ввода int[]
IntStream.of (массив);
Это возвращает Intstream.
В первом примере Java использует метод overloading
для поиска конкретного метода на основе типов ввода, в то время как во втором вы уже знаете тип ввода и вызываете конкретный метод.
Arrays.stream
имеет все перегруженные случаи для примитивных массивов. Т.е.Stream.of(new int[]{1,2,3})
даст вам какое-Stream<int[]>
то время, аArrays.stream
вернет вам то,IntStream
что, вероятно, вы хотите. Так что +1