У меня есть следующее перечисление:
private enum Actions {
f,
c,
r,
a
}
Я могу получить все значения перечисления в массиве следующим образом:
Actions[] all = Actions.values();
Я хотел бы получить массив значений меньше указанного значения, например. за исключением f. Я думаю, что что-то вроде этого должно делать то, что мне нужно, но я не могу правильно использовать:
Actions[] noF = Arrays.stream( Actions.values() )
.filter( value -> value != Actions.f )
.toArray();
Я бы хотел однострочное решение, подобное методу, который я пытаюсь, если это возможно. Кто-нибудь может помочь?
Вам нужно что-то вроде этого
Actions[] noF = Arrays.stream( Actions.values() )
.filter( value -> value != Actions.f )
.toArray(Actions[]::new);
Вы можете использовать EnumSet
для выполнения работы:
Set<Actions> exceptF = EnumSet.complementOf(EnumSet.of(Actions.f));
// Object array
Object[] exceptFObjectArray = exceptF.toArray();
// or Actions array
Actions[] exceptFActionsArray = exceptF.toArray(new Actions[0]);
Или за один раз:
Actions[] exceptF = EnumSet.complementOf(EnumSet.of(Actions.f))
.toArray(new Actions[0]);
Я думаю, что это намного удобнее для чтения, чем использование потока, как вы.
Это тоже здорово, Марк. Его конец, который должен быть правильным ответом. Извини, но я пошел с Дебмаля
@SteveW Нет проблем, я просто хотел предоставить альтернативу: просто потому, что вы можете делать что-то с потоком, не означает, что вам нужно (или нужно) их использовать;)
Вам нужно использовать
toArray(Actions[]::new)
, чтобы получить правильный тип массива.