2015-05-26 35 views
7

tôi muốn đếm các yếu tố khác nhau của một dòng suối và đang tự hỏi tại saoyếu tố đếm của một Stream

Stream<String> stream = Stream.of("a", "b", "a", "c", "c", "a", "a", "d"); 
Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, 1, Integer::sum)); 

không hoạt động. Eclipse nói với tôi

Phương pháp toMap (Function, Function, BinaryOperator) trong thu gom loại không áp dụng cho các đối số ((s) -> {}, int, Integer :: tổng hợp)

Bằng cách này, tôi biết về giải pháp mà:

Map<String, Long> counter2 = stream.collect(Collectors.groupingBy(s -> s, Collectors.counting())); 

Vì vậy, tôi có hai câu hỏi:

  1. là gì thứ e sai lầm trong cách tiếp cận đầu tiên của tôi?
  2. Bạn sẽ thực hiện bộ đếm như thế nào?

EDIT: tôi đã giải quyết được câu hỏi đầu tiên của bản thân mình:

Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum)); 

Java được mong đợi một chức năng như là đối số thứ hai.

+2

Nếu bạn tự giải quyết câu hỏi, chỉ cần viết câu trả lời thay vì chỉnh sửa câu hỏi. –

+0

@TagirValeev Nó chỉ là phần đầu tiên. Không phải là câu trả lời phải trả lời câu hỏi đầy đủ sao? Tôi cũng muốn mọi người không còn quan tâm đến việc nói cho tôi biết tôi đã làm gì sai. –

+0

http://stackoverflow.com/questions/25441088/group-by-counting-in-java8-stream-api –

Trả lời

4

Có một số cách thực hiện. Người bạn chưa đề cập là .collect(groupingBy(x -> x, summingInt(x -> 1)));

Có một số khác biệt về hiệu suất.

Phương pháp tiếp cận # 1 sẽ tốt nhất nếu có ít đối tượng trên mỗi nhóm. Trong trường hợp lý tưởng chỉ có 1 đối tượng trên mỗi thùng, bạn kết thúc với bản đồ cuối cùng ngay lập tức mà không cần sửa đổi các mục nhập. Trong trường hợp xấu nhất của việc có một số lượng lớn các đối tượng lặp lại, nó sẽ phải làm rất nhiều boxing/unboxing.

Phương pháp tiếp cận số 2 dựa trên counting() bộ thu không xác định chính xác cách tính số đếm. Việc thực hiện hiện tại chuyển tiếp đến reducing nhưng điều đó có thể thay đổi.

Phương pháp tiếp cận summingInt sẽ tích lũy số trong int thay vì Integer và do đó sẽ không yêu cầu bất kỳ quyền anh/unboxing nào. Nó sẽ là tốt nhất của nó nếu các đối tượng lặp lại một số lượng rất lớn lần.

Để chọn cái nào, tốt nhất là viết mã để rõ ràng và tối ưu hóa khi cần thiết. Với tôi, groupingBy(x->x, counting()) thể hiện ý định rõ ràng nhất, vì vậy đó là điều tôi muốn.

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