2016-10-24 84 views
1

我有一些逻辑会根据不活动的用户创建通知。我收到了具有以下属性的用户列表。我想要做的只是触发我的创建通知方法,如果一个部门有一个非活动用户。所以给出的文章,基本上1通知将获得创建说有在部门1不活动的用户和部门2.希望另一则通知,这是有道理java stream sort /按属性过滤列表

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外键,因此要检查这些属性,它需要是 –

+0

UserUnprocessed.getUser()。getDepartment - would I仍然能够使用你写出来的方法吗? –

0

开始过滤掉null和活跃用户为你只是对那些谁是不活跃位数的。之后,将结果按部门ID分组。使用结果映射到按键,即各部门迭代与不活动的用户:

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

注意,你也可以使用lambda表达式而不是方法引用(例如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; 
     } 
    } 

}