我有一个整数数组,需要将它转换为枚举数组。
enum my_enum {
APPLE, BANANA, ORANGE;
int getColorAsInt() { ... }
};
int[] foo = some_method_i_cannot_modify();
my_enum[] bar = ??? ( foo );
最简单的方法是什么?
Here我找到了将单个整数转换为枚举值的方法(他们在示例中使用了Color
枚举):
public static Color convertIntToColor(int iColor) {
for (Color color : Color.values()) {
if (color.getColorAsInt() == iColor) {
return color;
}
}
return null;
}
...但我希望有更直接的方法来进行转换(否则在我的代码中,首先使用枚举是没有意义的。)
Here是关于将单个整数转换为枚举值的问题。
答案 0 :(得分:4)
您需要使用循环或流来迭代整数的输入数组,并将每个映射到Color
实例。试试这个:
int[] array = getArrayOfInts();
Color[] colors = Arrays.stream(array)
.mapToObj(i -> convertIntToColor(i))
.filter(Objects::nonNull)
.toArray(Color[]::new);
答案 1 :(得分:3)
这取决于foo
数组中的内容。如果它是枚举的ordinal
,那么这样简单就足够了。
enum my_enum { APPLE, BANANA, ORANGE };
int[] foo = {0,2,2,1};
public void test(String[] args) {
my_enum[] bar = new my_enum[foo.length];
for (int i = 0; i < foo.length; i++) {
bar[i] = my_enum.values()[foo[i]];
}
System.out.println(Arrays.toString(bar));
}
打印
[APPLE,ORANGE,ORANGE,BANANA]
streams
等价物将类似于:
my_enum[] es = Arrays.stream(foo)
.mapToObj(i -> my_enum.values()[i])
.toArray(my_enum[]::new);
答案 2 :(得分:1)
这一行代码将返回对象数组,您可以访问枚举 由arr [0]
Object[] arr = Arrays.stream(my_enum.values()).map(x->x).toArray();
答案 3 :(得分:0)
但我希望有更直接的方法来进行转换
你没有选择权。因为您有int
个值,并且您想将它们转换为枚举值
因此,对于每个int
,你必须找到对应的枚举值,无论如何。
你在声明中使用枚举的顺序有一个更直接的方式 但这是一种非常容易出错的方法,它假设int值从0开始增加1。
答案 4 :(得分:0)
如果是你的public class UpdateDepartmentDescriptionCommand {
[Required, Range(1, long.MaxValue)]
public long DepartmentId { get; set; }
[Required, StringLength(256)]
public string Description { get; set; }
}
public HttpResponseMessage UpdateDepartmentDescription(UpdateDepartmentDescriptionCommand cmd) {
// validate command
var validationResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(cmd, new ValidationContext(cmd, null, null), validationResults, true);
if (!isValid) {
return Request.CreateResponse(HttpStatusCode.BadRequest, validationResults);
}
// retrieve Department from DB using the given ID
var department = _departmentDAL.Find(cmd.DepartmentId);
// only update values defined by the usecase
department.Description = cmd.Description;
var ok = _departmentDAL.Update(department);
return Request.CreateResponse(HttpStatusCode.OK, ok);
}
,你当然可以给它开始映射。
enum
答案 5 :(得分:0)
我会制作一张地图,从那里获取一个映射值。当然使用自己的id比序数更好,但要表现出一个想法:
enum Color {
RED, GREEN, BLUE;
public static Color[] create(int[] ids) {
Map<Integer, Color> colors = Arrays.stream(Color.values())
.collect(Collectors.toMap(Enum::ordinal, Function.identity()));
return Arrays.stream(ids)
.mapToObj(colors::get)
.filter(Objects::nonNull)
.toArray(Color[]::new);
}
};
public static void main(String[] args) {
int[] foo = new int[]{0,1,2};
System.out.println(Arrays.toString(Color.create(foo)));
}
输出
[RED, GREEN, BLUE]
答案 6 :(得分:0)
最好在List with Java上工作但有转换工具。也更喜欢使用Java约定:MyEnum。
enum MyEnum {
APPLE, BANANA, ORANGE;
public static void main(String[] arg) {
int[] foo = new int[] { 2, 0, 1 };
MyEnum[] bar = Arrays.stream(foo).boxed().map(
i->MyEnum.values()[i]
).toArray(MyEnum[]::new);
}
};
使用数组和int
使得使用流变得复杂,主要部分是使用:i->MyEnum.values()[i]
从int到enum转换
要使用此功能转换,您需要可从流中访问的map方法。