Java 8 如何在java8中使用if有效地创建列表?

Java 8 如何在java8中使用if有效地创建列表?,java-8,Java 8,我已经开始学习Java8。我一直遵循传统的方法,使用ifcondition创建一个列表(用于下面的代码)。我的代码正在工作,但是有没有有效的方法使用Java8来实现这一点?请让我知道 private List<String> getDeliveryAddressTypeList() { List<String> deliveryAddressTypeList = new ArrayList<>(); deliveryAddressTypeLis

我已经开始学习Java8。我一直遵循传统的方法,使用
if
condition创建一个列表(用于下面的代码)。我的代码正在工作,但是有没有有效的方法使用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;
}
private List getDeliveryAddressTypeList(){
List deliveryAddressTypeList=新建ArrayList();
add(DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue());
if(SecurityUtils.getSubject().isPermitted(PermissionConstant.PHARMISA\u DELIVERY\u pfproducts)){
deliveryAddressTypeList.add(DeliveryAddressType.DEPOT_ADDRESS.getValue());
}
if(SecurityUtils.getSubject().isPermitted(PermissionConstant.PHARMISA\u DELIVERY\u ALL\u CONTACTS)){
deliveryAddressTypeList.add(DeliveryAddressType.CONTACT_ADDRESS.getValue());
}
if(SecurityUtils.getSubject().isPermitted(PermissionConstant.PHARMISA\u DELIVERY\u FREE\u FROM\u ADDRESS)){
add(DeliveryAddressType.AN_ALTERNATIVE_ADDRESS.getValue());
}
返回deliveryAddressTypeList;
}

这里的问题是映射
PermissionConstant->DeliveryAddressType
。 假设您已经定义了一个常量
Map
like(如果插入顺序很重要,您也可以使用
LinkedHashMap

Map mappings=newhashmap();
mappings.put(PermissionConstant.PHARMISA_DELIVERY_pfproducts,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());
}
private静态列表getDeliveryAddressTypeList(){
Subject Subject=SecurityUtils.getSubject();
返回流.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());
}

您可以将代码和数据分开。按如下方式初始化静态映射:

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));
Map permissions=newhashmap();
permissions.put(DeliveryAddressType.MY\u DEFAULT\u地址,s->true);
权限.put(DeliveryAddressType.DEPOT_地址,
s->s.ispermited(PermissionConstant.PHARMISA_DELIVERY_pf驱逐);
权限.put(DeliveryAddressType.CONTACT_地址,
s->s.isPermited(PermissionConstant.PHARMISA_DELIVERY_ALL_CONTACTS));
permissions.put(DeliveryAddressType.AN_ALTERNATIVE_地址,
s->s.isPermited(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());
}
private List getDeliveryAddressTypeList(){
Subject Subject=SecurityUtils.getSubject();
返回权限。entrySet().stream()
.filter(条目->条目.getValue().test(主题))
.map(entry->entry.getKey().getValue())
.collect(Collectors.toList());
}

我相信最干净的方法就是你拥有它。尽管如此,您可以使用helper方法避免重复的
if
语句:

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

    if (SecurityUtils.getSubject().isPermitted(permission) {
        list.add(addressType.getValue());
    }
}
另一种方法是使用流和相同的映射,但从映射键创建最终列表:

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());
List deliveryAddressTypeList=map.entrySet().stream()
.filter(e->SecurityUtils.getSubject().isPermitted(e.getValue())
.map(map.Entry::getKey)
.map(DeliveryAddressType::getValue)
.collect(Collectors.toList());
add(DeliveryAddressType.MY_DEFAULT_ADDRESS.getValue());

在这里,您可以过滤映射条目,并仅保留其值(
permissionconsdant
)被安全性允许的条目。然后将每个筛选条目转换为其键(
DeliveryAddressType
),然后将每个
DeliveryAddressType
转换为其值。最后,您将所有这些送货地址类型值收集到一个列表中。

在上面的代码
中,如果
条件的返回值为true或false,我已将其添加到列表中。
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);
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());