2016-10-24 122 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; 
     } 
    } 

}