如何创建通用方法以返回枚举值的数组而不是其常量?

时间:2018-11-21 06:38:09

标签: java generics enums

我有一个描述为String的枚举。这是枚举。

public enum tabs
{
    A("Actual data"),
    B("Bad data"),
    C("Can data"),
    D("Direct data");

    private String description;
    tabs(String desc)
    {
        this.description = desc;
    }


    public String getDescription()
    {
        return this.description;
    }
}

现在,如果我需要A的数据,那我就做

tabs.A.description

我正在创建一个通用方法以返回值。

我设法利用以下通用方法接受枚举类型作为参数。 它返回一个枚举常量数组。 但是我实际上希望它返回值的数组。即{“实际数据”,“不良数据”,“可以数据”,“直接数据”}。

public static String[] getActualTabs(Class<? extends Enum<?>> e) 
{
    return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}

要实现这一目标,我需要选择什么?

3 个答案:

答案 0 :(得分:11)

您可以传递一个映射器Function来将枚举常量映射到String中:

public static <T extends Enum<T>> String[] getActualTabs(Class<T> e, Function<? super T, String> mapper) 
{
    return Arrays.stream(e.getEnumConstants()).map(mapper).toArray(String[]::new);
}

用法:

System.out.println(Arrays.toString(getActualTabs(tabs.class,tabs::getDescription)));

输出:

[Actual data, Bad data, Can data, Direct data]

答案 1 :(得分:4)

我首先将getDescription拉出一个界面,并确保您所有项目的枚举都实现了它:

public interface HasDescription {
    String getDescription();
}

然后,在您的通用方法中使用它:

public static String[] getActualTabs(Class<? extends Enum<?> & HasDescription> e) {
    return Arrays.stream(e.getEnumConstants())
                 .map(HasDescription::getDescription)
                 .toArray(String[]::new);
}

答案 2 :(得分:0)

两个答案都很好。

但是还有另一种变体可能会更出色,因为它的使用范围更加广泛:

public static <T> String[] getActualTabs(T[] values, Function<? super T, String> mapper) {
    return Arrays.stream(values)
                 .map(mapper)
                 .toArray(String[]::new);
}

public static <T extends HasDescription> String[] getActualTabs(T[] values) {
    return Arrays.stream(values)
                 .map(HasDescription::getDescription)
                 .toArray(String[]::new);
    // or just: return getActualTabs(values, HasDescription::getDescription);
}

此实现的好处是我们不必费心去思考。

相反,您可以这样称呼他们:

String[] tabs1 = getActualTabs(Tabs.values())
String[] tabs2 = getActualTabs(Tabs.values(), Tabs::getDescription)

请注意,重命名功能可能很有用,例如。 G。 getStringifiedValues()toDescriptions()

免责声明:恕我直言,但应该可以使用。