2017-04-24 112 views
-1

,則應用過濾器如果條件滿足(條件:如果爲principal.isAdministrator())此代碼序列,我想對用戶應用/或不進行過濾。如果條件爲

for (User oneUser : subcontractorUserRole.getUsers() 
    .filter(new OTMFilter(Identity.CompanyEmployeeRel.class, selectedCounty.getSubcontractor())) 
    .filter(Identity.DELETED, false)) 
    users.add(new GenericItem(oneUser.getId(), oneUser.getName())); 

我想要做這樣的事情:

if (principal.isAdministrator() { 
    for (User oneUser : subcontractorUserRole.getUsers() 
     //.filter(new OTMFilter(Identity.CompanyEmployeeRel.class, selectedCounty.getSubcontractor())) 
     .filter(Identity.DELETED, false)) 
     users.add(new GenericItem(oneUser.getId(), oneUser.getName())); 
} else { 
    for (User oneUser : subcontractorUserRole.getUsers() 
     .filter(new OTMFilter(Identity.CompanyEmployeeRel.class, selectedCounty.getSubcontractor())) 
     .filter(Identity.DELETED, false)) 
     users.add(new GenericItem(oneUser.getId(), oneUser.getName())); 
} 

你知道一個優雅的方式來寫這個不重複的循環?我可以使用其他Java 8 ...

謝謝。

+0

看看戰略模式。在這種情況下,我會做一個獲取'oneUser'的函數,它需要一個bool(isAdmin)並相應地設置過濾器。鑑於市政管理人員是否是管理人員,沒有其他副作用。 – Fildor

回答

0

試試這個

subcontractorUserRole.getUsers() 
    .stream() 
    .filter(i -> principal.isAdministrador() || new OTMFilter(Identity.CompanyEmployeeRel.class, selectedCounty.getSubcontractor())) 
    .filter(Identity.DELETED, false) 
    .forEach(oneUser -> users.add(new GenericItem(oneUser.getId(), oneUser.getName()))); 
0

如果操作複雜的邏輯是更好地流的基於謂詞有。

Predicate<User> isAdmin = u -> principal.isAdministrator(); 
Predicate<User> isOTMFpositive = new OTMFilter(Identity.CompanyEmployeeRel.class, selectedCounty.getSubcontractor()); 
Predicate<User> notDeleted = ... 
Predicate<User> fullPredicate = isAdmin.or(isOTMFpositive).and(notDeleted); 

subcontractorUserRole.getUsers() 
    .stream() 
    .filter(fullPredicate) 
    .map(u -> new GenericItem(u.getId(), u.getName())) 
    .collect(collect(Collectors.toList()));