我有以下方法:public static List<A> getValuesExclusion(A exclusion) {
return Arrays.stream(values())
.filter(item -> item != exclusion)
.collect(Collectors.toList());}//this function returns enum list of A types that has no A type'exclusion'現(xiàn)在我想將它作為參數(shù)列入一個列表:public static List<A> getValuesExclusion(A... exclusions){
return Arrays.stream(values())
.filter(???)
.collect(Collectors.toList());}我的問題是,如何針對第二種情況進行過濾?我想檢索一個枚舉列表,該列表排除所有值“排除”作為輸入。以下是A類的屬性:public enum A implements multilingualA{
A("a"),
B("b"),
C("c"),
D("d");
...}
3 回答

UYOU
TA貢獻1878條經(jīng)驗 獲得超4個贊
如果您想確保所有項目都不包含在exclusions
您可以執(zhí)行的操作中:
public static List<A> getValuesExclusion(AType... exclusions){ return Arrays.stream(values()) .filter(e -> Arrays.stream(exclusions).noneMatch(c -> c == e)) .collect(Collectors.toList());}
這將創(chuàng)造一個Stream
的exclusions
再利用noneMatch()
,以確保給定的AType
是不包括在Array

絕地?zé)o雙
TA貢獻1946條經(jīng)驗 獲得超4個贊
您應(yīng)該重新考慮是否List
真的是包含唯一元素的適當(dāng)數(shù)據(jù)類型。一個Set
通常是比較合適的。
然后,如果您關(guān)心性能,可以將其實現(xiàn)為
public static Set<A> getValuesExclusion(A... exclusions){ return exclusions.length == 0? EnumSet.allOf(A.class): EnumSet.complementOf(EnumSet.of(exclusions[0], exclusions));}
該類EnumSet
專門用于保存enum
類型的元素,只為每個常量存儲一個位,以判斷它是否存在。這允許像complementOf
只使用單個?binarynot?操作翻轉(zhuǎn)所有位的操作,而不需要實際遍歷enum
常量。
如果你堅持要回來List
,你可以這樣做
public static List<A> getValuesExclusion(A... exclusions){ return new ArrayList<>(exclusions.length == 0? EnumSet.allOf(A.class): EnumSet.complementOf(EnumSet.of(exclusions[0], exclusions)));}

慕少森
TA貢獻2019條經(jīng)驗 獲得超9個贊
我不會Stream
在這里使用s,而是使用(imho)更具可讀性的方法:
public static List<A> getValuesExclusion(AType... exclusions){ List<A> values = Arrays.asList(values()); values.removeAll(Arrays.asList(ex)); return values;}
添加回答
舉報
0/150
提交
取消