2014-04-11 20 views
12

Trong khi chơi đùa với Java8 của Streams-API, tôi stumbled trên như sau:Sử dụng Streams với các loại nguyên thủy dữ liệu và tương ứng với giấy gói

Để chuyển đổi một loạt các classe wrapper nguyên thủy đối tượng vào một Stream Tôi chỉ phải gọi Stream.of(array). Nhưng để chuyển đổi một mảng các kiểu dữ liệu nguyên thủy, tôi phải gọi .of(array) từ lớp dòng trình bao (lớp) tương ứng (< - có vẻ ngớ ngẩn).

Một ví dụ:

final Integer[] integers = {1, 2, 3}; 
final int[]  ints  = {1, 2, 3}; 


Stream.of(integers).forEach(System.out::println); //That works just fine 

Stream.of(ints).forEach(System.out::println);  //That doesn't 

IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead 


Câu hỏi của tôi (s): Tại sao điều này? Điều này có tương quan với ví dụ: hành vi của Arrays.asList() cũng chỉ hoạt động cho các mảng lớp bao bọc?

+3

Không phải là nó bình thường sử dụng phương pháp IntStream để đối phó với IntStreams, và phương pháp Suối để đối phó với Streams? –

+2

Bạn cũng có thể sử dụng 'Arrays.stream (ints) .forEach (System.out :: println)'. – skiwi

+0

@skiwi Điều đó thực sự rất hay. Cảm ơn – ifloop

Trả lời

15

Java 8 dòng khuôn khổ có chung Stream<T> cho các đối tượng như các yếu tố, và ba con suối nguyên thủy IntStream, LongStream, DoubleStream cho chính ba nguyên thủy. Nếu bạn làm việc với nguyên thủy, sử dụng một trong những thứ sau, trong trường hợp IntStream của bạn.

Xem hình ảnh:

enter image description here

gì nằm đằng sau là:

  1. Java generics không thể làm việc với các loại nguyên thủy: nó có thể chỉ có List<Integer>Stream<Integer>, nhưng không List<int>Stream<int>

  2. Khi khuôn khổ Java Collections đã được giới thiệu, nó đã được giới thiệu chỉ dành cho lớp học, vì vậy nếu bạn muốn có một List của int s, bạn phải bọc chúng để Integer s. Điều này là tốn kém!

  3. Khi khuôn khổ Java Streams đã được giới thiệu, họ quyết định để có được xung quanh chi phí này và song song với suối "lớp theo định hướng" (sử dụng cơ chế generics), họ đã giới thiệu ba bộ phụ của tất cả các chức năng thư viện, được thiết kế đặc biệt cho các loại nguyên thủy quan trọng nhất: int, long, double.

Và xem thêm một lời giải thích tuyệt vời ở đây: https://stackoverflow.com/a/22919112/2886891

Các vấn đề liên quan