Возвращает массив перечислений для списка заданных строк, содержащихся в перечислении, используя потоки - PullRequest
1 голос
/ 09 апреля 2020

У меня есть Enum of Strings вроде этого:

public enum SomeEnum {

  STRING1("some value"),
  STRING2("some other value");
  STRING3("some third value");

  ...more strings...

  private String name;

  SomeEnum(String name) {
    this.name = name;
  }

  @Override
  public String toString() {
    return name;
  }

И у меня есть List someStringList, содержащий несколько строк.

Я хочу перебрать someStringList и найти для него соответствующие перечисления ,

Например: список содержит строки «некоторое значение» и «некоторое третье значение», тогда я хотел бы использовать Java Stream-API для возврата мне списка, содержащего SomeEnum.STRING1 и SomeEnum. STRING3

Почему-то я не могу заставить это работать. Я пробовал что-то вроде этого:

    List<SomeEnum> enumList = Stream.of(someStringList).forEach( s -> Stream.of(SomeEnum.values()).filter(w -> w.toString().equalsIgnoreCase(s)).collect(Collectors.toList()));

, но это не компилируется, потому что ничего не возвращает. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

В вашем SomeEnum вы можете создать Map<String, SomeEnum> из строкового имени для перечисления и инициализировать его во время загрузки класса. Затем объявите метод c stati c в вашем SomeEnum с именем fromString, который возвращает константу перечисления для данной строки, если таковая существует.

private static final Map<String, SomeEnum> stringToEnum = Arrays.stream(values())
    .collect(Collectors.toMap(SomeEnum::toString, e -> e));

public static SomeEnum fromString(String name) {
    return stringToEnum.get(name);
}

Затем используйте его в своем коде клиента. Вот как это выглядит.

List<SomeEnum> enumList = someStringList.stream()
    .map(SomeEnum::fromString)
    .collect(Collectors.toList());
2 голосов
/ 09 апреля 2020

Построить карту из строки с соответствующим SomeEnum значением:

Map<String, SomeEnum> map = 
    Arrays.stream(SomeEnum.values()).collect(toMap(SomeEnum::toString, s -> s));

(Это можно сделать один раз и сохранить)

Затем вы можете посмотреть в этом:

List<SomeEnum> enumList = someStringList.stream().map(map::get).collect(toList());

(Вы можете или не хотите обрабатывать случай, когда строка не найдена на карте: например, вы можете выбросить исключение или удалить такие элементы).

...