Получить все данные из типа enum - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть enum с именем Product, каждый элемент переопределяет свой абстрактный метод, который возвращает Manufacture экземпляр:

public enum Product {
     FOO {
       @Override
       Manufacture getManufacture(){
            return // a instance of Manufacture
       }
     }

     BAR {
       @Override
       Manufacture getManufacture(){
            return // another instance of Manufacture
       }
     }

    abstract Manufacture getManufacture();
}

(Manufacture - это другой класс, который я создал, но онне важно видеть детали этого вопроса)

Вопрос 1: В другом классе я хочу получить набор изделий (Set<Manufactore>) из перечисления Product.Какой самый простой способ в Java 8?

Вопрос 2: А как насчет List<Manufacture>?

Вопрос 3: Как сделать то же самое для Вопросов 1 и 2 внутри класса enum, если онвозможно?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Stream.of(Product.values()).map(Product::getManufacture) возвращает Stream<Manufacture>.Теперь вы можете позвонить по нему

  1. .collect(Collectors.toSet()), чтобы получить Set<Manufacture>
  2. или .collect(Collectors.toList()), чтобы получить List<Manufacture>.

Редактировать:3-я точка

Если вы хотите получить доступ к этим коллекциям из enum, вы можете сохранить их в каком-то частном статическом поле и использовать для них методы получения.Чтобы не позволить клиентам изменять эти коллекции, вы можете каждый раз возвращать их копию в getter, например, через return new ArrayList(manufactureSet);, или вы можете сделать эту коллекцию неизменной и затем возвращать ее как

private static Set<Manufacture> manufacturers = Collections.unmodifiableSet(
        Stream.of(values()).map(MyEnum::getManufacture).collect(Collectors.toSet())
);

public static Set<String> getManufacturers() {
    return manufacturers;
}
0 голосов
/ 26 сентября 2019

Набор:

Arrays.stream(Product.values()).map(Product::getManufacture).collect(Collectors.toSet())

Список:

Arrays.stream(Product.values()).map(Product::getManufacture).collect(Collectors.toList())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...