các primitive
và object
phiên bản của các kiểu dữ liệu (ví dụ int và Integer, double và Double, vv) không thực sự tương thích với nhau trong Java. Chúng được làm tương thích thông qua bước bổ sung của auto-boxing/unboxing
. Vì vậy, nếu bạn có một dòng ints nguyên thủy và nếu bạn cố gắng sử dụng các phiên bản đối tượng của dòng và chức năng (tức là dòng và chức năng, bạn sẽ phải chịu chi phí đấm bốc và unboxing các chi phí của boxing và unboxing các yếu tố. gói chức năng chứa primitive specialized versions of streams
cũng như functional interfaces
. Ví dụ, thay vì sử dụng Stream<Integer>
, bạn nên sử dụng IntStream
. Bây giờ bạn có thể xử lý từng phần tử của dòng sử dụng IntFunction. Điều này sẽ tránh auto-boxing/unboxing hoàn toàn.
vì vậy , bất cứ khi nào bạn muốn xử lý các luồng nguyên tố nguyên thủy, bạn nên sử dụng các luồng chuyên biệt nguyên thủy (tức là IntStream, LongStream và DoubleStream) và inte chức năng chuyên biệt nguyên thủy rfaces (tức là IntFunction, IntConsumer, IntSupplier vv) để đạt được hiệu suất tốt hơn.
Một điều nữa cần lưu ý là không có giao diện chức năng đặc biệt nguyên thủy (chẳng hạn như IntFunction, DoubleFunction hoặc IntConsumer) mở rộng giao diện chức năng không nguyên thủy (tức là Chức năng, Người tiêu dùng, v.v.).
java.util.function package
chứa các phiên bản int, double và long (nhưng không có float) của tất cả các giao diện chức năng. Ví dụ, có một IntFunction, một DoubleFunction, và một LongFunction, đó là int, double, và dài, các phiên bản của Function. Các chức năng này được sử dụng cùng với các phiên bản chuyên biệt nguyên thủy của các luồng như IntStream, DoubleStream và LongStream.
Chúng ta hãy một số ví dụ:
Stream stream = Stream.of(1, 2, 3); //Will compile fine
IntStream intStream = IntStream.of(4, 5, 6); //Will compile fine
Stream s = IntStream.of(4, 5, 6); //Does not compile
Stream s = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed
IntStream is = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed
Như một kết luận, lý do bạn có thể sử dụng mapToObj
cũng giống như bạn có thể sử dụng mapToInt
, mà là để thay đổi kiểu Stream.
Chúng chỉ tồn tại trên các dòng nguyên thủy, trong đó 'bản đồ' hoạt động để ánh xạ loại nguyên thủy cho chính nó, ví dụ: 'IntStream.map (IntOperator)'. –