我有一个描述为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);
}
要实现这一目标,我需要选择什么?
答案 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()
。
免责声明:恕我直言,但应该可以使用。