Попытка создать ArrayList строк из класса enum

Мне удалось успешно загрузить свой ArrayList из значений класса enum. Я не очень хорошо знаком с использованием перечислений, и мне было интересно, есть ли способ справиться с этим, не вводя add для каждого перечисления, как я показал.

public enum PartsOfSpeech {
    Adjective("Placeholder [adjective] : To be updated..."),
    Adverb("Placeholder [adverb] : To be updated..."),
    Conjunction("Placeholder [conjection] : To be updated..."),
    Interjection("Placeholder [interjection] : To be updated..."),
    Noun("Placeholder [noun] : To be updated..."),
    Preposition("Placeholder [preposition] : To be updated..."),
    Pronoun("Placeholder [pronoun] : To be updated..."),
    Verb("Placeholder [verb] : To be updated...");


    private String speechValue;

    private PartsOfSpeech(String speechValue) {
        this.speechValue= speechValue;
    }

    public String getSpeechValue() {
        return speechValue;
    }

}
public class Dictionary {
    public static void main(String args[]) {
        System.out.println("! Loading data...");
        Map<String, List<String>> dictionaryMap = new HashMap<String, List<String>>();

        List<String> POSList = new ArrayList<>();

        POSList.add(PartsOfSpeech.Adjective.getSpeechValue());
        POSList.add(PartsOfSpeech.Adverb.getSpeechValue());
        POSList.add(PartsOfSpeech.Conjunction.getSpeechValue());
        POSList.add(PartsOfSpeech.Interjection.getSpeechValue());
        POSList.add(PartsOfSpeech.Noun.getSpeechValue());
        POSList.add(PartsOfSpeech.Preposition.getSpeechValue());
        POSList.add(PartsOfSpeech.Pronoun.getSpeechValue());
        POSList.add(PartsOfSpeech.Verb.getSpeechValue());

        dictionaryMap.put("distinct",POSList);

Побочная проблема: это Adjective("Placeholder [adjective] : To be updated..."), просто не выглядит правильно, поскольку похоже, что вы жестко кодируете детали реализации в модели, перечислении. Вероятно, лучше более простой ADJECTIVE("adjective"), ... или что-то подобное. Затем вы создадите свой "Placeholder [%s]: To be updated..." в каком-то более позднем месте, где вы будете отображать информацию для пользователя. В противном случае ваш код станет жестким, и его будет трудно улучшать, обновлять и изменять позже.

Hovercraft Full Of Eels 18.02.2019 03:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

values() метод возвращает массив значений enum. Вы можете перебрать эти значения, получить значение речи и добавить их в список.

Вот как вы можете сделать это с помощью Stream API:

List<String> POSList = Arrays.stream(PartsOfSpeech.values())
        .map(PartsOfSpeech::getSpeechValue)
        .collect(Collectors.toList());

И, следуя соглашению об именах Java, это должно быть posList, а не POSList.

Кроме того, что касается соглашения об именах, все константы перечисления должны быть в верхнем регистре.

Hovercraft Full Of Eels 18.02.2019 03:39

ОП может избавиться от speechValue и getSpeechValue(), используя ваш код а-ля: List<String> posList = Arrays.stream(PartsOfSpeech.values()).map(pos -> String.format(format, pos.toString().toLowerCase())).collect(Collectors.toList());

Hovercraft Full Of Eels 18.02.2019 03:51

ой, забыл формат Строка: String format = "\"Placeholder [%s] : To be updated...\"";

Hovercraft Full Of Eels 18.02.2019 03:57

@HovercraftFullOfEels да, это сделает перечисление чище. Но я думаю, что OP изменит часть заполнитель для обновления, поэтому каждая из них имеет свое уникальное значение. Если они этого не делают, то на самом деле это не свойство этого перечисления, и поэтому из него следует полностью удалить речевое значение. Его можно создать динамически (как вы предложили использовать format) при вставке значений в список/карту.

Kartik 18.02.2019 03:59

Другие вопросы по теме