Gần đây tôi đã tìm hiểu về các luồng trong Java 8 và bắt đầu làm việc với chúng. Bây giờ tôi có một câu hỏi liên quan đến phương pháp groupingBy
thu:Java 8 GroupingBy vào Peek
Thông thường tôi làm việc với .NET, vì vậy tôi so sánh (biết họ không giống nhau) Java Stream<T>
với .NET IEnumerable<T>
. Sau so sánh này, List<T>
các yếu tố cửa hàng và cụ thể Stream
/IEnumerable
áp dụng các hoạt động. Một ví dụ:
C#:
elements.Where(x => x.Value == 5).ToList();
Java:
elements.stream().filter(x -> x.getValue() == 5).collect(Collectors.toList());
Trong cả hai ví dụ, tôi bắt đầu với một danh sách, xác định hoạt động (một bộ lọc trong ví dụ này) và thu thập kết quả để lưu trữ nó (trong một danh sách mới trong ví dụ này).
Bây giờ tôi có một trường hợp phức tạp hơn:
data.stream()
.map(...).filter(...) // Some operations
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)));
Kết quả của truy vấn này là một Map<String, Long>
và tôi có thể làm việc với điều này, nhưng cho phép nói, tôi muốn tiếp tục với các dữ liệu này thay vì lưu trữ nó. Cách tiếp cận hiện tại của tôi là tầm thường:
...
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)))
.entrySet().stream().
.map(...) // Do more operations
Nhưng theo cách này, tôi rời khỏi luồng, lưu kết quả đầu tiên vào Bản đồ và mở luồng mới để tiếp tục. Có cách nào để nhóm mà không có người thu thập, để tôi có thể "ở lại" trong luồng không?
Vì bạn đang nhóm, bạn cần phải đi đến cửa hàng trung gian - bạn nên làm gì khi nhóm giá trị ở đầu luồng với giá trị ở cuối? Bạn sẽ cần phải xử lý "mọi thứ", lưu trữ nó cho đến khi bạn chắc chắn không có gì nhiều hơn để nhóm với. Vì vậy, nội bộ, Java sẽ phải (/ có thể?) Đặt mọi thứ trong một bản đồ (hoặc một số cấu trúc tương tự) anyway; những gì quá xấu về việc này làm cho mình? –
Nó không thực sự là một vấn đề, tôi có thể sống với cách tiếp cận tầm thường của tôi, nhưng trong tất cả các hoạt động dòng khác của tôi có một dòng rõ ràng giữa việc có một 'List' và có một' Stream'. Tôi mở nó ra, vận hành và thu thập nó. Bây giờ có một bản đồ, được mở ra cho một dòng mới, vì vậy tôi đã tự hỏi nếu nó có thể với một cách tiếp cận khác. –
Có lẽ tôi đã bối rối bởi nền .NET của tôi. Ở đó bạn có thể thực hiện bất kỳ thao tác nào trên một 'IEnumerable' và cuối cùng bạn thu thập kết quả của mình thông qua' ToList', 'ToArray',' ToDictionary' hoặc bằng cách lặp qua nó. –