2016-03-05 49 views
2

我已經開始學習Java8.I一直在使用if condition.I傳統的方式來創建一個列表(對於下面的代碼)。我的代碼工作,但有沒有什麼有效的方法來實現這個使用java8?請讓我知道如何在java8中有效地創建列表?

private List<String> getDeliveryAddressTypeList() { 
    List<String> deliveryAddressTypeList = new ArrayList<>(); 
    deliveryAddressTypeList.add(DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue()); 
    if (SecurityUtils.getSubject().isPermitted(PermissionConstant.PHARMISA_DELIVERY_PFDEPORTS)) { 
     deliveryAddressTypeList.add(DeliveryAddressType.DEPOT_ADDRESS.getValue()); 
    } 
    if (SecurityUtils.getSubject().isPermitted(PermissionConstant.PHARMISA_DELIVERY_ALL_CONTACTS)) { 
     deliveryAddressTypeList.add(DeliveryAddressType.CONTACT_ADDRESS.getValue()); 
    } 
    if (SecurityUtils.getSubject().isPermitted(PermissionConstant.PHARMISA_DELIVERY_FREE_FROM_ADDRESS)) { 
     deliveryAddressTypeList.add(DeliveryAddressType.AN_ALTERNATIVE_ADDRESS.getValue()); 
    } 
    return deliveryAddressTypeList; 
} 
+0

在上面的代碼中'if'condition'返回true或false.if我已經添加到列表中。 – anonymous

回答

1

我認爲最乾淨的方法是,你擁有它。不過,你可以使用一個輔助方法,以避免重複if聲明:

static void addIfPermitted(List<String> list, DeliveryAddressType addressType, 
    PermissionConstant permission) { 

    if (SecurityUtils.getSubject().isPermitted(permission) { 
     list.add(addressType.getValue()); 
    } 
} 

現在你可以使用這個輔助方法是這樣的:

List<String> deliveryAddressTypeList = new ArrayList<>(Arrays.asList(
    DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue())); 

addIfPermitted(deliveryAddressTypeList, 
    DeliveryAddressType.DEPOT_ADDRESS, 
    PermissionConstant.PHARMISA_DELIVERY_PFDEPORTS); 

addIfPermitted(deliveryAddressTypeList, 
    DeliveryAddressType.CONTACT_ADDRESS, 
    PermissionConstant.PHARMISA_DELIVERY_ALL_CONTACTS); 

addIfPermitted(deliveryAddressTypeList, 
    DeliveryAddressType.AN_ALTERNATIVE_ADDRESS, 
    PermissionConstant.PHARMISA_DELIVERY_FREE_FROM_ADDRESS); 

如果你想用java 8的東西,你可以創建一個Map<DeliveryAddressType, PermissionConstant>

List<String> deliveryAddressTypeList = new ArrayList<>(Arrays.asList(
    DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue())); 

Map<DeliveryAddressType, PermissionConstant> map = new HashMap<>(); 

map.put(DeliveryAddressType.DEPOT_ADDRESS, 
    PermissionConstant.PHARMISA_DELIVERY_PFDEPORTS); 
map.put(DeliveryAddressType.CONTACT_ADDRESS, 
    PermissionConstant.PHARMISA_DELIVERY_ALL_CONTACTS); 
map.put(DeliveryAddressType.AN_ALTERNATIVE_ADDRESS, 
    PermissionConstant.PHARMISA_DELIVERY_FREE_FROM_ADDRESS); 

然後:

map.forEach((addressType, permission) -> 
    addIfPermitted(deliveryAddressList, adressType, permission)); 

的另一種方法,使用流和相同的地圖,但是創建從地圖鍵最終名單:

List<String> deliveryAddressTypeList = map.entrySet().stream() 
    .filter(e -> SecurityUtils.getSubject().isPermitted(e.getValue())) 
    .map(Map.Entry::getKey) 
    .map(DeliveryAddressType::getValue) 
    .collect(Collectors.toList()); 

deliveryAddressTypeList.add(DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue()); 

這裏你過濾地圖項,只保留其值的那些(PermissionConsdtant)被允許安全。然後將每個過濾條目轉換爲其密鑰(DeliveryAddressType),然後將每個DeliveryAddressType轉換爲其值。最後,您將所有這些投遞地址類型值收集到一個列表中。

1

這裏的問題是映射PermissionConstant -> DeliveryAddressType。 假設你已經定義的常量Map<PermissionConstant, DeliveryAddressType>像(如果插入順序是有意義的,你也可以使用一個LinkedHashMap

Map<PermissionConstant, DeliveryAddressType> mappings = new HashMap<>(); 
mappings.put(PermissionConstant.PHARMISA_DELIVERY_PFDEPORTS, DeliveryAddressType.DEPOT_ADDRESS); 
mappings.put(PermissionConstant.PHARMISA_DELIVERY_ALL_CONTACTS, DeliveryAddressType.CONTACT_ADDRESS); 
mappings.put(PermissionConstant.PHARMISA_DELIVERY_FREE_FROM_ADDRESS, DeliveryAddressType.AN_ALTERNATIVE_ADDRESS); 

然後你罐頭只是CONCAT和流映射到得到結果:

private static List<String> getDeliveryAddressTypeList() { 
    Subject subject = SecurityUtils.getSubject(); 
    return Stream.concat(
     Stream.of(DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue()), 
     mappings.entrySet().stream() 
      .filter(m -> subject.isPermitted(m.getKey())) 
      .map(m -> m.getValue().getValue()) 
    ).collect(Collectors.toList()); 
} 
4

你可能會分開代碼和數據。初始化靜態地圖是這樣的:

Map<DeliveryAddressType, Predicate<Subject>> permissions = new HashMap<>(); 
permissions.put(DeliveryAddressType.MY_DEFAULT_ADDRESS, s -> true); 
permissions.put(DeliveryAddressType.DEPOT_ADDRESS, 
    s -> s.isPermitted(PermissionConstant.PHARMISA_DELIVERY_PFDEPORTS)); 
permissions.put(DeliveryAddressType.CONTACT_ADDRESS, 
    s -> s.isPermitted(PermissionConstant.PHARMISA_DELIVERY_ALL_CONTACTS)); 
permissions.put(DeliveryAddressType.AN_ALTERNATIVE_ADDRESS, 
    s -> s.isPermitted(PermissionConstant.PHARMISA_DELIVERY_FREE_FROM_ADDRESS)); 

現在你可以使用

private List<String> getDeliveryAddressTypeList() { 
    Subject subject = SecurityUtils.getSubject(); 
    return permissions.entrySet().stream() 
     .filter(entry -> entry.getValue().test(subject)) 
     .map(entry -> entry.getKey().getValue()) 
     .collect(Collectors.toList()); 
}