Один из возможных способов:
array.reduce((acc, ele) => {
const temp = ele.match(/<span.*?>(.*)<\/span>/)[1];
return temp ? acc.concat(temp) : acc;
}, [])
Я использую reduce
, потому что я не уверен, есть ли у всех элементов тег <span>
. Если так, то map
также работает.
Возможно, вы можете реализовать общий статический метод lookup
.
Примерно так
public class LookupUtil {
public static <E extends Enum<E>> E lookup(Class<E> e, String id) {
try {
E result = Enum.valueOf(e, id);
} catch (IllegalArgumentException e) {
// log error or something here
throw new RuntimeException(
"Invalid value for enum " + e.getSimpleName() + ": " + id);
}
return result;
}
}
Затем вы можете
public enum MyEnum {
static public MyEnum lookup(String id) {
return LookupUtil.lookup(MyEnum.class, id);
}
}
или явно вызвать метод поиска служебного класса.
Можно использовать статическую карту поиска, чтобы избежать исключения и возвратить пустой указатель, затем бросить, как Вы хотели бы:
public enum Mammal {
COW,
MOUSE,
OPOSSUM;
private static Map<String, Mammal> lookup =
Arrays.stream(values())
.collect(Collectors.toMap(Enum::name, Function.identity()));
public static Mammal getByName(String name) {
return lookup.get(name);
}
}
Apache Commons Lang 3 contais класс EnumUtils. Если Вы не используете Apache палата общин в Ваших проектах, Вы делаете его неправильно. Вы изобретаете велосипед!
существует дюжина прохладных методов, без которых мы могли использовать, выдает Исключение. Например:
Получает перечисление для класса, возвращая пустой указатель если не найденный.
Этот метод отличается от Enum.valueOf, в котором он не бросает exceptionfor недопустимое перечислимое имя и выполняет нечувствительное к регистру соответствие имени.
EnumUtils.getEnumIgnoreCase(SeasonEnum.class, season);
Почему мы должны писать этот 5-строчный код?
public class EnumTest {
public enum MyEnum {
A, B, C, D;
}
@Test
public void test() throws Exception {
MyEnum.valueOf("A"); //gives you A
//this throws ILlegalargument without having to do any lookup
MyEnum.valueOf("RADD");
}
}
Если вы хотите, чтобы поиск был нечувствительным к регистру, вы можете перебирать значения в цикле, делая его более удобным:
public enum MyEnum {
A, B, C, D;
public static MyEnum lookup(String id) {
boolean found = false;
for(MyEnum enum: values()){
if(enum.toString().equalsIgnoreCase(id)) found = true;
}
if(!found) throw new RuntimeException("Invalid value for my enum: " +id);
}
}
Сообщение об ошибке в IllegalArgumentException уже достаточно информативно.
Ваш метод делает общее исключение из определенного с тем же сообщением, просто перефразированным. Разработчик предпочел бы конкретный тип исключения и мог бы соответствующим образом обработать случай вместо того, чтобы пытаться обработать RuntimeException.
Если цель состоит в том, чтобы сделать сообщение более удобным для пользователя, то ссылки на значения перечислений в любом случае к ним не имеют отношения. Пусть код пользовательского интерфейса определяет, что следует отображать пользователю, и разработчику пользовательского интерфейса будет лучше использовать исключение IllegalArgumentException.
Похоже, у вас здесь плохая практика, но не там, где вы думаете.
Перехват исключения IllegalArgumentException
для повторной генерации другого RuntimeException
с более четким сообщением может показаться хорошей идеей, но это не так. Потому что это означает, что вы заботитесь о сообщениях в ваших исключениях.
Если вы заботитесь о сообщениях в ваших исключениях, это означает, что ваш пользователь каким-то образом видит ваши исключения. Это плохо.
Если вы хотите предоставить явное сообщение об ошибке своему пользователю, вы должны проверить правильность значения перечисления при синтаксическом анализе пользовательского ввода и отправить соответствующее сообщение об ошибке в ответ, если пользовательский ввод неверен.
Что-то вроде:
// This code uses pure fantasy, you are warned!
class MyApi
{
// Return the 24-hour from a 12-hour and AM/PM
void getHour24(Request request, Response response)
{
// validate user input
int nTime12 = 1;
try
{
nTime12 = Integer.parseInt(request.getParam("hour12"));
if( nTime12 <= 0 || nTime12 > 12 )
{
throw new NumberFormatException();
}
}
catch( NumberFormatException e )
{
response.setCode(400); // Bad request
response.setContent("time12 must be an integer between 1 and 12");
return;
}
AMPM pm = null;
try
{
pm = AMPM.lookup(request.getParam("pm"));
}
catch( IllegalArgumentException e )
{
response.setCode(400); // Bad request
response.setContent("pm must be one of " + AMPM.values());
return;
}
response.setCode(200);
switch( pm )
{
case AM:
response.setContent(nTime12);
break;
case PM:
response.setContent(nTime12 + 12);
break;
}
return;
}
}