Элегантный способ десериализации EnumSet из String

Я хотел бы сериализовать некоторые EnumSet<FooType> в String используя его toString() метод.

Например: EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString() дам [COMMON, MEDIUM],

Речь идет об элегантном способе десериализации такой строки обратно в EnumSet<FooSet>, Я ищу какую-то общеизвестную библиотеку (может быть как apache-commons) или стандартный Util-класс для таких вещей.

Что-то вроде: EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

Я реализовал эту вещь таким образом:

public static <E extends Enum<E>> EnumSet<E> valueOf(Class<E> eClass, String str) {
    String[] arr = str.substring(1, str.length() - 1).split(",");
    EnumSet<E> set = EnumSet.noneOf(eClass);
    for (String e : arr) set.add(E.valueOf(eClass, e.trim()));
    return set;
}

Но, может быть, есть готовое решение или кардинально простой способ сделать это.

3 ответа

Решение

С Java 8 вы можете сделать что-то подобное с лямбда-выражениями и потоками:

EnumSet.copyOf(Arrays.asList(str.split(","))
.stream().map(FooType::valueOf).collect(Collectors.toList()))

С гуавой 19.0:

    Iterable<String> i = Splitter.on(",")
        .trimResults(CharMatcher.WHITESPACE.or(CharMatcher.anyOf("[]")))
        .split(str);
    Set<YourEnum> result = FluentIterable.from(i)
        .transform(Enums.stringConverter(YourEnum.class)).toSet();

ИЛИ другой способ с библиотекой JSON, если вы можете принять такой формат String, как этот ['COMMON', 'MEDIUM'],

Используя библиотеку Gson ('com.google.code.gson:gson:2.3.1'), вы можете сделать:

public static EnumSet getEnumObject(Type type, String jsonStrToDeserialize) {
    Gson gson = new Gson();
    return jsonStrToDeserialize == null ? null : (EnumSet) gson.fromJson(jsonStrToDeserialize, type);
}
Другие вопросы по тегам