2017-10-02 54 views
6

Mam listę obiektów z dwoma String dziedzinach jakStrumienie Java 8 - jak manipulować wartością w grupie według wyniku?

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

I chciałbym mieć

Map<Boolean, List<String>> 

gdzie Aktywny = true i nieaktywnych = false.

Próbowałem

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

Ale dostałam

Map<Boolean, List<DualField>> 

Odpowiedz

7

Przede wszystkim, można użyć partitioningBy, który jest szczególnym przypadkiem groupingBy (gdzie jesteś groupin g przez Predicate na dwie grupy). Możesz odwzorować obiekty na wymagane łańcuchy przy pomocy mapping.

Jestem zakładając chcesz List<String> zawierać wartości drugiego obiektu (czyli nie getPropertyValue(), który zawiera „aktywny” lub „nieaktywny”):

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

kod staje się bardziej czytelny, zastępując ' StringUtils.equals (x.getPropertyValue(), "Active") 'z' x.getPropertyValue(). Equals ("Active") 'lub, jeśli obsługa' null' jest pożądana, '" Active ".equals (x.getPropertyValue()) '' Istnieje również standardowa metoda API 'Objects.equals', która obsługuje' null', więc w obu przypadkach nie ma potrzeby, aby biblioteka 3rd party zapewniała nadmiarowe metody, takie jak 'StringUtils.equals' ... – Holger

2

Jeśli chcesz, aby List<String> się składać z propertyValue, niż:

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