Câu trả lời:
Bạn có thể sử dụng Arrays.stream Eg
Arrays.stream(array);
Bạn cũng có thể sử dụng Stream.of
như được đề cập bởi @fge, trông giống như
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Nhưng lưu ý Stream.of(intArray)
sẽ trở lại Stream<int[]>
trong khi Arrays.stream(intArr)
sẽ trả về IntStream
cung cấp cho bạn vượt qua một loạt các loại int[]
. Vì vậy, tóm lại cho loại nguyên thủy, bạn có thể quan sát sự khác biệt giữa 2 phương thức Eg
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Khi bạn chuyển mảng nguyên thủy sang Arrays.stream
, đoạn mã sau được gọi
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
và khi bạn truyền mảng nguyên thủy cho Stream.of
đoạn mã sau được gọi
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Do đó bạn nhận được kết quả khác nhau.
Đã cập nhật : Như đã đề cập bởi nhận xét của Stuart Marks Quá tải phụ Arrays.stream
được ưu tiên sử dụng Stream.of(array).skip(n).limit(m)
vì các kết quả trước trong luồng SIZED trong khi điều sau thì không. Lý do là vì limit(m)
không biết kích thước là m hay nhỏ hơn m, trong khi Arrays.stream
kiểm tra phạm vi và biết kích thước chính xác của luồng Bạn có thể đọc mã nguồn để thực hiện luồng được trả về Arrays.stream(array,start,end)
tại đây , trong khi thực hiện luồng được trả về Stream.of(array).skip().limit()
là trong phương pháp này .
Stream.of
có thể mang đến cho bạn một số điều ngạc nhiên (như khi bạn gọi Arrays.asList
với một mảng nguyên thủy và mọi người mong đợi sự List<Integer>
trở lại) :-)
Arrays.stream
hỗ trợ truyền phát một loạt các mảng, điều IntStream.of
này không. Ngược lại, Stream.of
là sự lựa chọn tốt hơn nếu bạn muốn một Stream<int[]>
kích thước 1
...
Arrays.stream
được ưu tiên sử dụng Stream.of(array).skip(n).limit(m)
vì kết quả trước trong luồng SIZED trong khi luồng sau thì không. Lý do là limit(m)
không biết kích thước lớn m
hơn hoặc nhỏ hơn m
, trong khi Arrays.stream
đó phạm vi kiểm tra và biết kích thước chính xác của luồng.
Arrays.stream(array,start,end)
trả về một Stream
người thực hiện ở đây , trong khi Stream.of(array).skip().limit()
trả lại một Stream
người thực hiện trong phương thức này .
Thay thế cho giải pháp của @ sol4me:
Stream.of(theArray)
Sự khác biệt giữa điều này và Arrays.stream()
: nó sẽ tạo ra sự khác biệt nếu mảng của bạn thuộc kiểu nguyên thủy. Chẳng hạn, nếu bạn làm:
Arrays.stream(someArray)
đâu someArray
là a long[]
, nó sẽ trả về a LongStream
. Stream.of()
mặt khác, sẽ trả về a Stream<long[]>
với một phần tử duy nhất.
Arrays.stream()
hoạt động cho điều đó
*Stream.of()
khi bạn có Arrays.stream()
khi xử lý các mảng nguyên thủy. Và đối với các mảng không phải là các đối tượng thực, thì, đây là Java, đây là trường hợp kể từ 1.0 vì vậy hãy giải quyết nó; nghiền ngẫm về điều này chẳng giúp được gì
Arrays.stream()
không thuận tiện, tôi coi nó là thuận tiện. Đủ nói.
*Stream.of()
thuận tiện hơn để trở nên ngụy biện; bởi vì đó là vấn đề sở thích . Tôi thích Arrays.stream()
các trường hợp như vậy, điều này làm cho nó sai như một quy tắc chung Stream.of()
thuận tiện hơn (đại số Peano).
Stream.of("foo", "bar", "baz")
Hoặc, nếu bạn đã có một mảng, bạn cũng có thể làm
Stream.of(array)
Đối với các loại nguyên thủy sử dụng IntStream.of
hoặc LongStream.of
vv
int[]
một phương thức có thể được truyền cho một phương thức chấp nhận varargs, tại sao sẽ không Stream.of(intArray)
tạo ra một Stream<Integer>
thay thế Stream<int[]>
? Ngoài ra, có bất kỳ lý do kỹ thuật tại sao có các lớp Stream chuyên biệt cho người nguyên thủy không?
int[]
không giống như các mảng khác. Nó không phải là một lớp con của Object[]
, nhưng nó là một lớp con của Object
. Vì vậy, khi bạn chuyển nó tới Stream.of
, nó được lấy làm Object
tham số, và bạn nhận được một luồng int[]
. Đó là một trong những lý do để có các lớp chuyên biệt cho nguyên thủy - nếu bạn không tạo luồng từ mảng nguyên thủy sẽ khá đau đớn. Lý do khác, đó là lớp chuyên là hiệu quả hơn, vì không cần phải chịu các Object
chi phí từ đấm bốc (chuyển đổi int
để Integer
làm cho nó trông giống như đối tượng bình thường).
int[]
là một Object
, nó sẽ phù hợp với phương thức quá tải of(T t)
và do đó nó trả về Stream<int[]>
. Vì vậy, về mặt lý thuyết mà nói, nếu phương pháp này không có sẵn, chúng ta sẽ nhận được Stream<Integer>
lợi nhuận? hoặc có thể nó gây ra lỗi biên dịch vì không thể tìm thấy phương thức khớp? tức là int[]
không thể được coi làT...
Stream<Integer>
theo cách đó, vì Stream.of(t ... T)
vẫn phù hợp với cùng một cách.
Bạn cũng có thể thực hiện bằng phương pháp cấp thấp có tùy chọn song song:
/**
* 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)
Bạn có thể sử dụng Arrays.stream:
Arrays.stream (mảng);
Điều này đảm bảo loại hơi trả về dựa trên loại đầu vào mảng của bạn nếu String []
sau đó trả về Stream<String>
, nếu int []
sau đó trả vềIntStream
Khi bạn đã biết mảng kiểu đầu vào thì tốt để sử dụng một kiểu cụ thể như kiểu đầu vào int[]
IntStream.of (mảng);
Điều này trả về Intux.
Trong ví dụ đầu tiên, Java sử dụng phương thức overloading
để tìm phương thức cụ thể dựa trên các kiểu đầu vào trong khi ở giây thứ hai bạn đã biết kiểu đầu vào và gọi phương thức cụ thể.
Arrays.stream
có tất cả các trường hợp quá tải cho mảng nguyên thủy. Tức làStream.of(new int[]{1,2,3})
sẽ cung cấp cho bạnStream<int[]>
trong khiArrays.stream
sẽ cung cấp cho bạn mộtIntStream
cái mà có lẽ là những gì bạn muốn. Vì vậy, +1