2017-04-24 9 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

戦略パターンを見てください。この場合、bool(isAdmin)を受け取り、それに応じてフィルタを設定する 'oneUser'を取得する関数を作成します。その金額が管理者であるかどうかには他の副作用がないことを考えると、 – 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())); 
関連する問題