它归结为我正在尝试基于枚举器从List<T>
包构造java.util.List
,但这里是捕获 - 我不希望第一个值在列表。我想出这样做的方式......嗯......这不是一件好事。
这是我正在使用的代码:
Arrays.asList(Arrays.asList(MyEnum.values()).remove(0));
这有效地创建了List&lt;&gt;从我的枚举中删除第一个值,然后尝试使用创建的列表创建另一个列表。
这实际上可能是正确的方法,但只是看着它就是尖叫“低效”。我在一个论坛上向一些人展示了我是其中的一员,他们都说这是多么丑陋,笑了;然而,他们中没有一个能够/将提供更好的方法去做。
答案 0 :(得分:3)
怎么样:
Arrays.asList(MyEnum.values()).subList(1, MyEnum.values().length);
答案 1 :(得分:3)
我不认为代码真的很丑或效率低下。更大的问题是它不起作用,因为Arrays.asList
返回的列表由底层数组支持,因此它具有固定的大小。
您可以使用subList
代替remove
来使其正常运行:
List<MyEnum> list = Arrays.asList(MyEnum.values());
list = list.subList(1, list.size());
这意味着结果列表实际上包含两个列表对象(asList
及其subList
),这些对象可能会或可能不会打扰您。但是,您可以从结果列表中创建展平ArrayList
:
list = new ArrayList<>(list);
如果您最小化对象分配,请循环使用这些值并将它们直接添加到单个列表中:
MyEnum[] values = MyEnum.values();
List<MyEnum> list = new ArrayList<>(values.length - 1);
for (int i = 1; i < values.length; i++)
list.add(values[i]);
答案 2 :(得分:0)
您确定无法(不会想)使用MyEnum.values并以不同方式处理您的第一个元素吗?
public enum Enums {
first,
b,
c,
d,
e,
f;
public boolean isFirst(Enums e) {
return e == first;
}
}
答案 3 :(得分:-1)
这样可行:
List<T> enums = Arrays.asList(Arrays.copyOfRange(MyEnum.values(), 1, MyEnum.values().length - 1));
或java 8:
Arrays.stream(MyEnum.values()).collect(Collectors.toList()).subList(1, MyEnum.values() - 1);
嗯......好多了。