2017-06-20 13 views
10

Tại sao không phải là stream.count() trả lại int?Tại sao java stream.count() trả lại một thời gian dài?

Tôi hiểu rằng tôi có thể dễ dàng chuyển đổi các long một int bởi đúc,

return (int) players.stream().filter(Player::isActive).count(); 

nhưng tại sao sẽ một java stream.count() trả về một long thay vì một int?

+9

Tại sao nó phải trả về một int nếu bạn có thể dễ dàng chuyển đổi từ một đủ dài thành int, nhưng không phải từ một int tràn ngập trở lại lâu dài? –

+4

Khi bạn xử lý luồng, thông thường nó sẽ là thứ rất lớn vì thế lý do để phát trực tuyến. Chuyển đổi dài thành một int sẽ mất percision nếu số lượng lớn. –

+2

vì 'long' dài hơn' int' – ACV

Trả lời

12

Cũng đơn giản vì đó là giá trị nguyên thủy 64 bit lớn nhất mà java có. Một cách khác sẽ hai đếm:

countLong/countInt 

và đó sẽ trông thực sự kỳ lạ.

int phù hợp trong một long, nhưng không phải theo cách khác. Bất cứ điều gì bạn muốn làm với int bạn có thể phù hợp trong một thời gian dài, vậy tại sao cần phải cung cấp cả hai?

16

Khi Java ra mắt vào đầu năm 1996, các PC thông thường có bộ nhớ từ 8 đến 16 Mb. Vì cả mảng và bộ sưu tập đều gắn liền với kích thước bộ nhớ, việc sử dụng int để thể hiện số phần tử dường như là tự nhiên, vì nó đủ để giải quyết một mảng có kích thước 4Gb - kích thước khổng lồ ngay cả đối với ổ cứng vào năm 1996, RAM. Do đó, sử dụng long thay vì int đối với kích thước bộ sưu tập có vẻ như lãng phí vào thời điểm đó.

Mặc dù kích thước int có thể là một yếu tố hạn chế vào các thời điểm, nhà thiết kế Java không thể thay đổi thành long, bởi vì nó sẽ là một thay đổi đột phá.

Không giống như bộ sưu tập Java, luồng có thể có số lượng phần tử không giới hạn tiềm năng và chúng không có cân nhắc về khả năng tương thích. Do đó, sử dụng long với phạm vi giá trị rộng hơn của nó có vẻ giống như một lựa chọn rất hợp lý.

+0

Một số bộ sưu tập Java cũng có thể chứa số lượng phần tử có khả năng không giới hạn (như LinkedList) mặc dù 'kích thước' của chúng sẽ được báo cáo sai. – ooxi

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