2016-10-24 2 views
1

У меня есть некоторая логика, которая будет создавать уведомления на основе пользователей, которые неактивны. Я получаю список пользователей, у которых есть следующие свойства. То, что я пытаюсь сделать, только инициирует метод создания уведомлений, если у отдела есть неактивный пользователь. Поэтому, учитывая список ниже, в основном 1 уведомление будет получить создано говоря есть неактивный пользователь в отдел 1 и еще одно уведомление для DEPT 2. Надеюсь, что это имеет смыслjava stream сортировать/фильтровать через список по свойствам

users: 
{name: John, active: f, deptId: 1} 
{name: Jane, active: f, deptId: 1} 
{name: Mike, active: t, deptId: 1} 
{name: Joe, active: f, deptId: 2} 
{name: Jim, active: t, deptId: 2} 

Мой текущий код в основном хотел бы получить этот список, а затем проверьте активный флаг на каждом из них и создайте уведомление для каждого пользователя, но мне нужно его реорганизовать.

List<User> users = userRepository.findAll(); 
for(User u : users){ 
    if(u != null && u.getActive == false){ 
     ....create Notification method 

Что бы быть лучшим способом сгруппировать их по отделам, а затем только проверка, если есть активный флаг ложно для каждого из этих групп и создание 1 уведомления, а не уведомлений для каждого пользователя, который неактивен?

ответ

0

Может быть, вы найдете следующий фрагмент полезный:

public Map<String, List<User>> getInactiveUsersByDepartment(List<User> allUsers) { 
    return allUsers.stream().filter(user -> user != null).filter(user -> !user.getActive()).collect(Collectors.groupingBy(User::getDepartment)); 
} 
+0

На самом деле я сделал опечатку и оставил что-то. Список фактически не поступает из домена пользователя. Он находится в другой таблице с именем UserUnprocessed, которая имеет внешний ключ userId в таблице User, поэтому для проверки этих свойств необходимо, чтобы это было –

+0

UserUnprocessed.getUser(). GetDepartment - я бы все еще сможете использовать метод, который вы выписали? –

0

Начать с отфильтровывая null и активных пользователей, как вы интересуетесь только в тех, кто не является активным. Затем группируйте результат по идентификатору отдела. Используйте полученную карту перебрать основной набор, то есть отделы с неактивными пользователями:

users.stream().filter(Objects::nonNull) 
     .filter(((Predicate<User>) User::isActive).negate()) 
     .collect(Collectors.groupingBy(User::getDeptId)) 
     .keySet().forEach(Notifier::notifyDepartment); 

Обратите внимание, что вы можете также использовать лямбду-выражение вместо ссылки методы (например, user -> !user.isActive()), это всего лишь вопрос стиля.

Вы можете использовать этот MCVE поиграться с реализацией, она просто выводит из пострадавших отделов:

import java.util.Arrays; 
import java.util.List; 
import java.util.function.Predicate; 
import java.util.stream.Collectors; 

public class ReportInactiveUsers { 

    public static void main(String[] args) { 
     User u1 = new User("John", false, 1); 
     User u2 = new User("Jane", false, 1); 
     User u3 = new User("Mike", true, 1); 
     User u4 = new User("Joe", false, 2); 
     User u5 = new User("Jim", true, 2); 
     User u6 = null; 
     List<User> users = Arrays.asList(u1, u2, u3, u4, u5, u6); 

     users.stream().filter(Objects::nonNull) 
       .filter(((Predicate<User>) User::isActive).negate()) 
       .collect(Collectors.groupingBy(User::getDeptId)) 
       .keySet().forEach(System.out::println); 
    } 

    public static class User { 
     private String name; 
     private boolean active; 
     private int deptId; 

     public User(String name, boolean active, int deptId) { 
      this.name = name; 
      this.active = active; 
      this.deptId = deptId; 
     } 

     public String getName() { 
      return name; 
     } 

     public boolean isActive() { 
      return active; 
     } 

     public int getDeptId() { 
      return deptId; 
     } 
    } 

} 
Смежные вопросы