2016-04-17 21 views
9

Tôi có một danh sách a mà tôi muốn chia nhỏ thành một vài danh sách nhỏ.Làm thế nào để phân vùng một danh sách theo vị từ sử dụng java8?

nói tất cả các mục có chứa "aaa", tất cả các mục có chứa "bbb" và một số vị từ khác.

Tôi làm cách nào để sử dụng java8?

Tôi thấy số này post nhưng nó chỉ chia nhỏ thành 2 danh sách.

public void partition_list_java8() { 

    Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s"); 

    Map<Boolean, List<String>> decisionsByS = playerDecisions.stream() 
      .collect(Collectors.partitioningBy(startWithS)); 

    logger.info(decisionsByS); 

    assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3); 
} 

tôi thấy post này, nhưng nó đã rất cũ, trước khi java 8.

+2

Một vị là boolean. Nó chỉ có "đúng" và "sai". Tôi nghĩ sẽ tốt hơn nếu sử dụng 'Hàm' và' Bộ sưu tập :: nhóm trong trường hợp của bạn. – RealSkeptic

Trả lời

22

Giống như đã được giải thích trong @RealSkepticcommentPredicate chỉ có thể trả lại hai kết quả: đúng và sai. Điều này có nghĩa là bạn sẽ chỉ có thể chia dữ liệu của mình thành hai nhóm.
Những gì bạn cần là một số loại Function sẽ cho phép bạn xác định một số kết quả phổ biến cho các thành phần sẽ được nhóm lại với nhau. Trong trường hợp của bạn, kết quả như vậy có thể là ký tự đầu tiên trong chữ thường của nó (giả sử rằng tất cả các chuỗi không trống - có ít nhất một ký tự).

Bây giờ với Collectors.groupingBy(function) bạn có thể nhóm tất cả các phần tử trong Danh sách riêng và lưu trữ chúng trong Bản đồ trong đó khóa sẽ là kết quả chung được sử dụng để nhóm (như ký tự đầu tiên).

Vì vậy, mã của bạn có thể trông giống như

Function<String, Character> firstChar = s -> Character.toLowerCase(s.charAt(0)); 

List<String> a = Arrays.asList("foo", "Abc", "bar", "baz", "aBc"); 
Map<Character, List<String>> collect = a.stream() 
     .collect(Collectors.groupingBy(firstChar)); 

System.out.println(collect); 

Output:

{a=[Abc, aBc], b=[bar, baz], f=[foo]} 
2

Bạn có thể sử dụng Collectors.groupingBy để biến dòng lại (nhóm) -> (danh sách những thứ trong nhóm đó). Nếu bạn không quan tâm đến các nhóm, hãy gọi số values() trên bản đồ đó để nhận số Collection<List<String>> của các phân vùng của bạn.

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