2014-04-26 31 views
7

Câu hỏi này liên quan đến việc ánh xạ và nhóm các phần tử bằng cách sử dụng trình thu thập java 8. Tôi có một danh sách bệnh nhân. Mỗi bệnh nhân có một danh sách các phòng ban mà ông đã đến thăm. Nói rằng tôi muốn đếm cho mỗi phòng ban có bao nhiêu thời gian nó đã được truy cập bằng cách sử dụng API thu gom mới trong java 8, làm thế nào tôi sẽ nhóm theo danh sách các phòng ban?Bộ thu thập Java 8 API

Cảm ơn!

LƯU Ý: Tôi biết rằng tôi có thể đặt một bộ đếm trong mỗi phòng ban, câu hỏi này chỉ dành cho mục đích học các tính năng java 8 mới.

Code:

public class Patient { 
    private String id; 
    private List<Department> history; 
    /* some more getters/setters come here */ 
} 

Trong phương pháp chính của tôi, tôi có một danh sách các bệnh nhân. Tôi muốn biết cho mỗi Sở, bao nhiêu thời gian nó đã được truy cập, mà không cần chỉnh sửa các lớp Sở (hoặc mở rộng hoặc trang trí nó).

Tôi nghĩ rằng tôi phải lấy một dòng bệnh nhân và ánh xạ chúng vào một bản đồ của dept-> đếm (bao nhiêu lần mỗi bệnh nhân đến thăm mà nợ.). Có một luồng các bản đồ này - tôi không biết phải làm gì để nhóm các bản đồ này và đếm chúng.

+0

này được giải thích có lẽ là tốt nhất theo mã. Vui lòng xác định mã bệnh nhân và bộ phận của bạn để mọi người có thể tham gia vào đó. –

+0

@owlstead: Tôi đã thêm các trường của lớp Bệnh nhân. Điều này phải đơn giản, tôi không thể tìm ra cách để làm điều đó. Lưu ý rằng tôi không thêm mã cho Bộ vì nó không có ý nghĩa, nó có thể dễ dàng là một String –

Trả lời

11

Trước tiên, tôi sẽ giả định rằng nếu bệnh nhân đã truy cập một Bộ nhiều lần, Bộ sẽ xuất hiện trong danh sách lịch sử của Bệnh nhân nhiều lần.

Nếu trường hợp đó xảy ra, thì chúng tôi có thể đơn giản lấy Luồng bệnh nhân của chúng tôi và flatMap nó vào Luồng các khoa, nơi xảy ra một cục chỉ ra một lần khám bệnh nhân.

Sau đó, chúng tôi có thể chuyển số này tới bộ sưu tập groupingBy. Chúng tôi muốn phân loại theo Bộ, vì vậy chức năng phân loại là chức năng nhận dạng.

Đối với giá trị, chúng tôi muốn đặt 1 làm giá trị nếu mục nhập cho Cục chưa xuất hiện, nhưng chúng tôi muốn thêm 1 vào giá trị hiện tại nếu có mục nhập. Có một nhà sưu tập gọi là counting() thực hiện điều này cho chúng tôi, vì vậy chúng tôi chỉ chuyển cho người thu gom dưới dạng một người thu gom ở hạ lưu thành groupingBy().

Mã kết quả như sau:

import static java.util.stream.Collectors.*; 

List<Patient> patients = ... ; 

Map<Department, Long> frequency = 
    patients.stream() 
     .flatMap(p -> p.getHistory().stream()) 
     .collect(groupingBy(d -> d, counting())); 

Lưu ý rằng nếu một cục chưa được truy cập, nó sẽ chỉ đơn giản là vắng mặt khỏi bản đồ. Nếu bạn có một danh sách các phòng ban, bạn có thể điền vào các giá trị zero như thế này:

departments.forEach(d -> frequency.putIfAbsent(d, 0L)); 

hoặc nếu bạn muốn điền vào các zero trên get bên,

long numVisits = frequency.getOrDefault(dept, 0L); 
+0

Trông đủ đơn giản và dường như hoạt động. Bạn nên lưu ý rằng bạn đã nhập Bộ thu thập tĩnh mặc dù. Bạn có thể giải thích logic của giải pháp? –

+1

@nocgod Tôi nghĩ rằng tôi đã gõ vào lời giải thích cùng một lúc bạn đang yêu cầu nó.:-) –

+1

Tôi đoán bạn là :) Tôi sẽ phải thực hiện một công tắc nhỏ để có được toàn bộ phong cách lambda chức năng này - không chạm vào nó từ khóa học PPL và ngôn ngữ lược đồ của tôi. Cảm ơn một lần nữa! –

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