2016-03-21 37 views
6

Tôi đang viết một phương thức có đầu vào Map của biểu mẫu Map<Term, List<Integer>> trong đó Term được xác định here.Java 8 - Danh sách bộ lọc bên trong giá trị bản đồ

Phương pháp:

  1. Đi qua các phím của Map và lọc chúng bằng cách sử dụng thuộc tính Term.
  2. Đối với mỗi phím còn lại, có được kích thước của danh sách tương ứng, nắp nó đến 5 (min(List.size(), 5)) và thêm đầu ra cho một var toàn cầu (nói, totalSum)
  3. Return totalSum

này là những gì tôi đã viết cho đến thời điểm này:

inputMap 
    .entrySet() 
    .stream() 
    .filter(entry -> entry.getKey().field().equals(fieldName)) // Keep only terms with fieldName 
    .forEach(entry -> entry.getValue() 
     .map(size -> Math.min(entry.getValue().size(), 5))) // These 2 lines do not work 
     .sum(); 

Tôi không thể lấy làm đầu vào một danh sách, xuất số nguyên cho mỗi danh sách đó và trả về tổng của tất cả các kết quả đầu ra.

Tôi rõ ràng có thể viết nó bằng cách sử dụng cho vòng, nhưng tôi đang cố gắng để tìm hiểu Java 8 và tò mò nếu vấn đề này là khả năng giải quyết bằng cách sử dụng nó.

+1

Giao diện 'Map' hiện có phương thức' forEach() 'của riêng nó, lấy một thể hiện' BiConsumer'. Điều này có thể được sử dụng để đơn giản hóa mã của bạn. –

Trả lời

11

Bạn không cần phương thức forEach. Bạn có thể map mỗi mục của Map một int, và sum những số nguyên:

int sum = inputMap 
    .entrySet() 
    .stream() 
    .filter(entry -> entry.getKey().field().equals(fieldName)) 
    .mapToInt(entry -> Math.min(entry.getValue().size(), 5)) 
    .sum(); 
0

Các foreach gọi chấm dứt dòng. Bạn có thể sử dụng bản đồ trực tiếp mà không cần forEach.

2

Với Eclipse Collections, mục sau sẽ hoạt động bằng cách sử dụng MutableMapIntList.

MutableMap<Term, IntList> inputMap = 
    Maps.mutable.of(term1, IntLists.mutable.of(1, 2, 3), 
        term2, IntLists.mutable.of(4, 5, 6, 7)); 

long sum = inputMap 
    .select((term, intList) -> term.field().equals(fieldName)) 
    .sumOfInt(intList -> Math.min(intList.size(), 5)); 

Lưu ý: Tôi là người cam kết cho Bộ sưu tập Eclipse.

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