Как передать значение Java List (Varargs) в метод? - PullRequest
4 голосов
/ 12 мая 2019

У меня есть следующий метод:

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());
}

У меня вопрос, как я могу сделать фильтр для второго случая? Я хотел бы получить список перечисления, который исключает все значения «исключения» в качестве входных данных. Вот атрибуты класса А:

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

Ответы [ 3 ]

5 голосов
/ 12 мая 2019

Если вы хотите убедиться, что все элементы не включены в 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

3 голосов
/ 13 мая 2019

Вы должны переосмыслить, действительно ли List является подходящим типом данных для чего-то, содержащего уникальные элементы.A 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, который просто переворачивает все биты с помощью одной операции «двоичное не», без необходимости фактически проходить константы 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)));
}
2 голосов
/ 12 мая 2019

Я бы не стал использовать здесь Stream с, но с (imho) более читабельным подходом:

public static List<A> getValuesExclusion(AType... exclusions){
    List<A> values = Arrays.asList(values());
    values.removeAll(Arrays.asList(ex));
    return values;
}
...