2017-10-26 12 views
5

Một vài tuần trước, tôi đã tìm kiếm một cách để trích xuất một số giá trị cụ thể từ một tệp và tình cờ gặp phải số question giới thiệu tôi với đối tượng Stream.Các luồng không song song có nghĩa là thực hiện một phép toán với khối lượng lớn dữ liệu không?

Bản năng đầu tiên của tôi là điều tra xem đối tượng này có hỗ trợ các thao tác tệp khác không, chẳng hạn như thay thế một vài trình giữ chỗ với các giá trị tương ứng mà tôi đã sử dụng BufferedReaderFileWriter. Tôi đã thất bại thảm hại trong việc sản xuất bất kỳ mã làm việc nào, nhưng kể từ đó tôi bắt đầu quan tâm đến các bài viết đã đề cập đến chủ đề này, vì vậy tôi có thể hiểu được mục đích sử dụng của Stream.

Trên đường đi, tôi tình cờ gặp Optional và đã hiểu rõ về điều đó và giờ đây có thể xác định các trường hợp tôi thấy thoải mái khi sử dụng Optional trong khi vẫn duy trì mã của mình rõ ràng và dễ hiểu. Tuy nhiên, tôi không thể nói trường hợp này là Stream, không đề cập đến nó may not have provided the performance gain I imagined it would bringwill still need a finally clause in cases where IO is involved. Đây là vấn đề chính mà tôi đã cố gắng để quấn quanh đầu của tôi, hãy nhớ rằng tôi chủ yếu làm việc trên lập trình một sợi cho đến bây giờ: Khi nào thì nó thích sử dụng một Stream ngoài việc xử lý song song không? Không.

Có phải hoạt động hàng loạt trên tập hợp con cụ thể của một tập hợp dữ liệu lớn, trong đó Collection có thể được sử dụng khi truy cập và thao tác các đối tượng cụ thể của bộ sưu tập đó không? Mặc dù nó có vẻ là mục đích sử dụng, tôi vẫn không chắc chắn rằng ví dụ tôi đã liên kết ở đầu câu hỏi của tôi là trường hợp sử dụng điển hình của bạn.

Hoặc là nó chỉ là một cấu trúc được sử dụng để làm cho mã nhỏ hơn nhờ biểu hiện lambda tại sự hy sinh của khả năng đọc? (Không có gì chống lại lambda nếu được sử dụng đúng, nhưng hầu hết các ví dụ về sử dụng Stream tôi thấy nơi khá không đọc được, mà không giúp cho sự hiểu biết chung của tôi)

+4

Tôi có thể chỉ cho bạn một vài ví dụ tại nơi làm việc của chúng tôi, nơi chúng tôi đã xác định lại một số mã cho luồng-api so với các vòng đồng bằng, tức là * theo nghĩa đen * 10 lần ngắn hơn và IMO dễ đọc hơn. – Eugene

Trả lời

2

Tôi luôn luôn mô tả trên Java 8 Streams API page để giúp tôi quyết định giữa một số Collection và một số Stream:

Tuy nhiên, [API luồng] có nhiều lợi ích. Trước tiên, API luồng sử dụng một số kỹ thuật như sự lười biếng và đoản mạch để tối ưu hóa dữ liệu của bạn truy vấn xử lý.

Cả hai StreamCollection có thể được sử dụng để áp dụng tính toán trên từng phần tử của tập dữ liệu trước khi lưu trữ. Tuy nhiên, tôi đã tìm thấy Streams hữu ích nếu đường ống của tôi bao gồm một số hoạt động lọc/sắp xếp/bản đồ riêng biệt cho từng phần tử dữ liệu, vì API luồng có thể tối ưu hóa các tính toán này sau hậu trường và hỗ trợ song song được tích hợp.

Tôi đồng ý khả năng đọc có thể bị ảnh hưởng cả tích cực và tiêu cực bằng cách sử dụng một Stream - bạn đúng khi cho rằng một số Stream ví dụ là hoàn toàn không thể đọc được, và tôi không nghĩ rằng khả năng đọc nên là điểm quyết định quan trọng cho việc sử dụng một Stream hơn cái gì khác.

Nếu bạn thực sự tối ưu hóa hiệu suất trên tập dữ liệu lớn, hãy cân nhắc sử dụng bộ công cụ được xây dựng nhằm mục đích cho các tập dữ liệu lớn thay thế.

+0

Tôi có thể đã tập trung quá nhiều vào việc xây dựng câu hỏi của mình về hiệu suất, vì hiệu suất (nghĩa là hiệu suất thời gian như hiểu biết nhiều nhất) chỉ là một phần của động lực của tôi. Chính xác hơn tôi quan tâm đến mức độ thích hợp của nó là sử dụng 'Stream'. Điều đó nói rằng, nếu tôi hiểu câu trả lời của bạn một cách chính xác, có vẻ như để giải quyết vấn đề. Hãy để tôi diễn giải những gì tôi hiểu: "Việc sử dụng' Luồng' không liên quan đến kích thước của tập dữ liệu mà còn liên quan đến độ phức tạp của hoạt động mà bạn muốn áp dụng cho tập dữ liệu đã nói ". Tôi có đúng trong cách giải thích của tôi không? – Eldros

+0

Có, điều đó nghe có vẻ đúng với tôi @Eldros. Nếu bạn có thể dễ dàng tách ra các bước riêng biệt để áp dụng cho từng thành viên tập dữ liệu, một 'Dòng' có vẻ như một cược chắc chắn vì API đó có thể kết hợp các bước bất cứ khi nào có thể. –

+0

Nhưng phạm vi đầu vào của bạn, tức là bạn có muốn thực hiện một cuộc đình công chính xác và dàn trải rộng không? Trích dẫn tài liệu API ['Stream'] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html):" _Các bộ sưu tập chủ yếu liên quan đến việc quản lý hiệu quả, Ngược lại, các luồng không cung cấp một phương tiện để trực tiếp truy cập hoặc thao tác các phần tử của chúng và thay vào đó có liên quan đến việc mô tả nguồn gốc của chúng và các hoạt động tính toán sẽ được thực hiện tổng hợp trên nguồn đó._ "Shouldn nó cũng là một yếu tố? – Eldros

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