我有以下方法: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'现在我想将它作为参数列入一个列表: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条经验 获得超4个赞
如果您想确保所有项目都不包含在exclusions
您可以执行的操作中:
public static List<A> getValuesExclusion(AType... exclusions){ return Arrays.stream(values()) .filter(e -> Arrays.stream(exclusions).noneMatch(c -> c == e)) .collect(Collectors.toList());}
这将创造一个Stream
的exclusions
再利用noneMatch()
,以确保给定的AType
是不包括在Array
绝地无双
TA贡献1946条经验 获得超4个赞
您应该重新考虑是否List
真的是包含唯一元素的适当数据类型。一个Set
通常是比较合适的。
然后,如果您关心性能,可以将其实现为
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⟩操作翻转所有位的操作,而不需要实际遍历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条经验 获得超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
提交
取消