如何将这两种方法重构为一种方法

时间:2019-08-08 09:26:26

标签: java java-8 enums

使用lamda表达式作为方法的摘要 如何合并 将枚举转换为Java地图

public Collection<Map<String, String>> getAllStoreTypeList() {
    Collection<ShopTypeEnum> shopTypeEnums = getAllStoreTypeEnus();
    List<Map<String, String>> result = shopTypeEnums.stream().map(e -> {
        Map<String, String> map = new HashMap();
        map.put(VALUE, e.getValue());
        map.put(NAME, e.name());
        map.put(TAG_PROP_TYPE, TAG_TYPE);
        return map;
    }).collect(Collectors.toList());
    return result;
}


public Collection<Map<String, String>> getAllShopBussinessList() {
    Collection<ShopBusinessEnum> shopBusinessEnums = getShopBusinessEnus();
    List<Map<String, String>> result = shopBusinessEnums.stream().map(e -> {
        Map<String, String> map = new HashMap();
        map.put(VALUE, e.getValue());
        map.put(NAME, e.name());
        map.put(TAG_PROP_TYPE, TAG_TYPE);
        return map;
    }).collect(Collectors.toList());
    return result;
}    

ShopTypeEnumShopBusinessEnum声明

public enum ShopBusinessEnum  implements EnumValueWare {

    beauty("美容"),
    maintenance("养护"),
    fix("维修"),
    paint("喷漆"),
    metalPlate("钣金"),
    certificate("办证"),
    violation("违章"),
    insurance("保险"),
    check("例检"),
    boutique("精品"),
    repair("抢修"),
    vehicleParts("全车件"),
    battery("电瓶"),
    tire("轮胎"),
    decoration("装潢"),
    conversion("改装");


    private static final Map<String, ShopBusinessEnum> LOOKUP = new LinkedHashMap<>();

    static {
        for (ShopBusinessEnum shopBusinessEnum : EnumSet.allOf(ShopBusinessEnum.class)) {
            LOOKUP.put(shopBusinessEnum.value, shopBusinessEnum);
        }
    }

    private String value;

    ShopBusinessEnum(String value) {
        this.value = value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public static ShopBusinessEnum fromValue(String value) {
        return LOOKUP.get(value);
    }

    public static Map<String, ShopBusinessEnum> getLOOKUP() {
        return LOOKUP;
    }
}

public enum ShopTypeEnum implements EnumValueWare {

    _4s("4s店"),
    repairShop("维修厂"),
    chainStore("连锁店"),
    quickRepaired("快修快保店"),
    insurancePainting("钣金喷漆"),
    carBeauty("汽车美容"),
    onlyTire("轮胎专营"),
    onlyBattery("电瓶专营"),
    modifiedStore("改装店");

    private static final Map<String, ShopTypeEnum> LOOKUP = new LinkedHashMap<>();

    static {
        for (ShopTypeEnum shopTypeEnum : EnumSet.allOf(ShopTypeEnum.class)) {
            if (shopTypeEnum.ordinal() == 0) {
                shopTypeEnum.setValue(shopTypeEnum.value.replace("_", ""));
            }
            LOOKUP.put(shopTypeEnum.value, shopTypeEnum);
        }
    }

    private String value;

    ShopTypeEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public static ShopTypeEnum fromValue(String value) {
        return LOOKUP.get(value);
    }

    public static Map<String, ShopTypeEnum> getLOOKUP() {
        return LOOKUP;
    }
}

// common interface
public interface EnumValueWare {

    String getValue();

}


//呼叫

    public Collection<Map<String, String>> get(Supplier<Collection<? extends Enum<? extends EnumValueWare>>>  supplier) {
        return supplier.get().stream().map(e -> {
            Map<String, String> map = new HashMap();
            map.put(VALUE, e.getValue());// error can not resolve method getValue
            map.put(NAME, e.name());
            map.put(TAG_PROP_TYPE, TAG_TYPE);
            return map;
        }).collect(Collectors.toList());
    }

2 个答案:

答案 0 :(得分:3)

您可以使用Supplier<Collection<? extends Enum<?>>>获取要迭代的集合。

public Collection<Map<String, String>> get(Supplier<Collection<? extends Enum<?>>> supplier) {
    return supplier.get().stream().map(e -> {
      Map<String, String> map = new HashMap<>();
      // populate
      return map;
    }).collect(Collectors.toList());
}

要调用它,

object.get(() -> getAllStoreTypeEnus());
object.get(() -> getShopBusinessEnus());

我注意到您正在使用e.getValue()界面中不包含的Enum

我假设存在一个通用接口

interface ValueAware {
     String getValue(); 
}

enum ShopTypeEnum implements ValueAware { ... }
enum ShopBusinessEnum implements ValueAware { ... }

所以您可以将参数类型缩小到

Supplier<Collection<? extends Enum<? extends ValueAware>>>

否则,您将收到编译错误

map.put(VALUE, e.getValue());

答案 1 :(得分:0)

也许只需更改即可:

Collection<? extends Enum> theEnums = ...

收件人:

public Collection<Map<String, String>> getProperty(Collection<? extends Enum> theEnums) {
  return theEnums.stream().map(....

因为这样您仍然可以处理某种枚举,但是您与实际类型无关。因此,您应该能够很好地使用一段代码来迭代这样的集合。

赞:

Main