如何在方法中流式传输Java List(Varargs)的值?

Jac*_*ack 4 java list java-8 java-stream

我有以下方法:

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'
Run Code Online (Sandbox Code Playgroud)

现在,我想将其作为参数列表:

public static List<A> getValuesExclusion(A... exclusions){
        return Arrays.stream(values())
                .filter(???)
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何为第二种情况做过滤器?我想检索一个将所有值“ exclusions”排除在外的枚举列表。以下是A类的属性:

public enum A implements multilingualA{
    A("a"),
    B("b"),
    C("c"),
    D("d");
    ...
}
Run Code Online (Sandbox Code Playgroud)

GBl*_*ett 5

如果要确保未将所有项目都包括在内,则exclusions可以执行以下操作:

public static List<A> getValuesExclusion(AType... exclusions){
        return Arrays.stream(values())
                .filter(e -> Arrays.stream(exclusions).noneMatch(c -> c == e))
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个Streamof exclusions,然后用于noneMatch()确保该给定AType不包含在Array

  • @Jack通常,`enum`常量和* vargargs *参数的数量太小而无法使之有意义。但是,如果您有大量的常量和大量的排除参数,这将是非常低效的,时间复杂度为O(n×m),并且在整个操作过程中都包含一个包含此枚举的所有常量的数组。请参阅[我的答案](/sf/answers/3927583551/)以获取没有这些缺陷的解决方案。但是,正如所说的那样,实际上,您很少有数字可以使之成为重要的区别。 (2认同)