2017-10-02 16 views
6

Tôi có một danh sách các đối tượng với hai String lĩnh vực nhưDòng Java 8 - Làm cách nào để thao tác giá trị trong một nhóm theo kết quả?

Name1, Active 
Name2, InActive 
Name3, InActive 
Name4, Active 

Và tôi muốn có một

Map<Boolean, List<String>> 

nơi Active = true và không hoạt động = false.

tôi đã cố gắng

active = dualFields.stream().collect(
     Collectors.groupingBy( 
      x -> StringUtils.equals(x.getPropertyValue(), "Active"))); 

Nhưng tôi nhận

Map<Boolean, List<DualField>> 

Trả lời

7

Trước hết, bạn có thể sử dụng partitioningBy, đây là trường hợp đặc biệt của groupingBy (nơi bạn đang nhóm g theo số Predicate thành hai nhóm). Bạn có thể ánh xạ các đối tượng đến các Chuỗi được yêu cầu với mapping.

Tôi giả sử bạn muốn List<String> để chứa các giá trị của tài sản thứ hai (tức là không getPropertyValue(), trong đó có "hoạt động" hoặc "không hoạt động"):

Map<Boolean,List<String>> map = 
    dualFields.stream() 
       .collect(Collectors.partitioningBy(x -> StringUtils.equals(x.getPropertyValue(), "Active"), 
               Collectors.mapping(DualField::getSecondPropertyValue, 
                    Collectors.toList())); 
+0

Mã này trở nên dễ đọc hơn bằng cách thay thế ' StringUtils.equals (x.getPropertyValue(), "Active") 'với' x.getPropertyValue(). Bằng ("Active") 'hoặc, nếu xử lý' null' là mong muốn, '" Active ".equals (x.getPropertyValue)()) '... Cũng có phương thức API chuẩn' Objects.equals' xử lý 'null', vì vậy trong cả hai trường hợp, không cần thư viện của bên thứ ba cung cấp các phương thức dự phòng như' StringUtils.equals'… – Holger

2

Nếu bạn muốn List<String> của bạn được bao gồm propertyValue, hơn:

active = dualFields.stream().collect(
     Collectors.groupingBy( 
      x -> StringUtils.equals(x.getPropertyValue(), "Active"), 
      Collectors.mapping(DualField::getPropertyValue, Collectors.toList()); 
      )); 
Các vấn đề liên quan