Yanıtlar:
Arrays.stream Eg kullanabilirsiniz.
Arrays.stream(array);
Ayrıca Stream.of
, @fge tarafından belirtildiği gibi kullanabilirsiniz.
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Ama dikkat Stream.of(intArray)
dönecektir Stream<int[]>
oysa Arrays.stream(intArr)
dönecektir IntStream
Eğer türü bir dizi geçmesi sağlayarak int[]
. Yani ilkel tip için bir özetle, 2 yöntem arasındaki farkı gözlemleyebilirsiniz.
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
İlkel diziyi Arrays.stream
ilettiğinizde, aşağıdaki kod çağrılır
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
ve ilkel diziyi geçirdiğinizde Stream.of
aşağıdaki kod çağrılır
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Böylece farklı sonuçlar elde edersiniz.
Güncellendi : Stuart Marks yorumunda belirtildiği gibi, alt Arrays.stream
öğesinin aşırı yüklenmesinin kullanılması tercih edilir, Stream.of(array).skip(n).limit(m)
çünkü eski boyutlar SIZED akışıyla sonuçlanırken ikincisi bunu yapmaz. Bunun nedeni ise limit(m)
, oysa boyut m veya daha az m'den olup olmadığını bilmiyor Arrays.stream
aralık kontrolleri yapar ve Sen tarafından döndürülen akış uygulaması için kaynak kodunu okuyabilir akışının tam boyutunu bilir Arrays.stream(array,start,end)
burada akışı için uygulama tarafından döndürülen oysa Stream.of(array).skip().limit()
DİR bu yöntem dahilinde .
Stream.of
sürpriz verebilir ( Arrays.asList
ilkel bir dizi ile aradığınızda ve insanların bir List<Integer>
geri beklediğiniz gibi ) :-)
Arrays.stream
dizinin, bir dizi akışı destekler IntStream.of
değil. Buna karşılık, bir boyut istiyorsanızStream.of
daha iyi bir seçimdir …Stream<int[]>
1
Arrays.stream
kullanılması tercih edilir Stream.of(array).skip(n).limit(m)
çünkü birincisi SIZED akışıyla sonuçlanırken ikincisi bunu yapmaz. Bunun nedeni, limit(m)
boyutun m
küçük veya küçük olup olmadığını bilmediği m
halde Arrays.stream
, aralık akışın tam boyutunu denetler ve bilir.
Arrays.stream(array,start,end)
bir döner Stream
kimin uygulamasıdır burada , oysa Stream.of(array).skip().limit()
bir getiri Stream
gerçekleştirme aşamasında içindedir bu yöntemle .
@ Sol4me'nin çözümüne alternatif:
Stream.of(theArray)
Bu ve arasındaki farkın Arrays.stream()
: Bu mu senin dizi ilkel türden olduğu takdirde bir fark yaratır. Örneğin, şunları yaparsanız:
Arrays.stream(someArray)
nerede someArray
a long[]
, geri dönecektir a LongStream
. Stream.of()
, diğer taraftan, Stream<long[]>
tek bir öğeyle birlikte a döndürür .
Arrays.stream()
bunun için de çalışıyor
*Stream.of()
sen varken Arrays.stream()
ilkel diziler ile uğraşırken. Ve diziler gerçek nesneler olmamaya gelince, bu Java, 1.0'dan beri durum böyle; Bunun üzerine
Arrays.stream()
, uygun olmamaya ben o uygun olarak düşünün. Yeterince söylendi.
*Stream.of()
için daha uygun olduğunu savunuyorum; çünkü bu bir tercih meselesi . Bu Arrays.stream()
gibi durumları tercih ederim , bu da daha genel bir kural olarak yanlış yapar Stream.of()
(Peano cebiri).
Stream.of("foo", "bar", "baz")
Veya zaten bir diziniz varsa,
Stream.of(array)
İlkel tip kullanım için IntStream.of
ya da LongStream.of
vs.
int[]
varargs kabul eden bir yönteme geçirilebildiğinde, neden bunun yerine Stream.of(intArray)
üretmeyesiniz ? Ayrıca, ilkeller için neden özel Stream sınıfları olduğuna dair teknik bir neden var mı? Stream<Integer>
Stream<int[]>
int[]
diğer diziler gibi değil. Bu bir alt sınıfı değil Object[]
, ama olduğu bir alt sınıfıdır Object
. Yani, ilettiğinizde , parametre Stream.of
olarak alınır Object
ve bir akış elde edersiniz int[]
. İlkel için özel sınıflara sahip olmanın nedenlerinden biri de budur - ilkel dizilerden akış oluşturmadıysanız oldukça acı verici olurdu. Diğer nedeni, tahakkuk gerekmez çünkü uzman sınıflar, daha verimli olmasıdır Object
boks gelen yükü (dönüştürme int
için Integer
normal nesneler gibi görünmesi için).
int[]
bir Object
olduğu için aşırı yüklenmiş yöntemle eşleşir of(T t)
ve dolayısıyla geri döner Stream<int[]>
. Peki, teorik olarak, eğer bu yöntem mevcut olmasaydı, karşılığında biz var Stream<Integer>
mıydık? ya da eşleştirme yöntemini bulamadığı için bir derleme hatasına neden olabilir? yani int[]
muamele edilemezT...
Stream<Integer>
bu şekilde elde edemeyiz , çünkü Stream.of(t ... T)
yine de aynı şekilde eşleşirdi.
Paralel seçeneğe sahip düşük seviyeli yöntemle de yapabilirsiniz:
/**
* 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 komutunu kullanabilirsiniz:
(Dizi) Arrays.stream;
Bu, dizi giriş türünüze göre geri dönüş buhar türünü sağlarsa, String []
geri dönerse Stream<String>
, int []
geri dönerseIntStream
Giriş türü dizisini zaten biliyorsanız, giriş türü gibi belirli bir tür kullanmak iyi int[]
IntStream.of (dizi);
Bu, Intstream değerini döndürür.
İlk örnekte, Java overloading
, girdi türlerine göre belirli bir yöntemi bulmak için yöntemi kullanır , ikinci sırada ise girdi türünü ve belirli yöntemi çağırmayı zaten biliyorsunuzdur.
Arrays.stream
ilkel diziler için aşırı yüklenmiş durumlar vardır. YaniStream.of(new int[]{1,2,3})
bir verecektirStream<int[]>
oysaArrays.stream
verecek bir geriIntStream
istediğini muhtemelen hangi. Yani +1