Оценивать, если список Strings содержит число в java

Я работаю со списком, который содержит urls, что должны быть исключенными в фильтре.

List<String> excludeFromFilter = Arrays.asList(ApiResources.Account_LOGIN,
        ApiResources.Account.URI_GET_MERCHANT,
        ApiResources.Account.URI_GET_ACCOUNT);

Немедленно для функциональности я оцениваю если excludeFromFilter contine url, который прошел с ним по request:

final HttpServletResponse response = (HttpServletResponse) servletResponse;
final String path = request.getPathInfo();

if (!excludeFromFilter.contains(path)) {
   ...
}

Проблема состоит в том, что от случая к случаю я должен проверять, что был исключен url, который содержит параметр, например: /api/accounts/24что соответствовало бы постоянной величине ApiResources.Account.URI_GET_ACCOUNT который он считает стоимостью /api/accounts/{accountId}. Я не могу заменять 24 с {accountId} для утверждения, потому что ниже я могу нуждаться в том, чтобы исключить url, который содержал бы другой параметр, например /api/accounts/{merchantId}.

Как я могу использовать функцию contains (), зачем я санкционировал, если у url есть любое число в этом параметре. В настоящее время так блистай списком:

[/user/login, / api / merchants / {merchantId}, / api / accounts / {accountId}]

и для вышеупомянутой стоимости он должен бы быть true функция contains () со стоимостью как: "/api/accounts/24", "/api/accounts/1", "/api/accounts/130".

0
задан 01.04.2016, 23:51
1 ответ

Ты этого не добьешься с List#contains. То, что ты можешь делать, состоит в том, чтобы использовать группу главных файлов regexps и искать, если какой-либо из них делает матч с цепью (url), который ты нуждаешься в том, чтобы оценить.

Здесь пример:

List<Pattern> listaRegex = asList(
    Pattern.compile(ApiResources.Account_LOGIN),
    Pattern.compile(ApiResources.Account.URI_GET_MERCHANT),
    Pattern.compile(ApiResources.Account.URI_GET_ACCOUNT)
);

Понимая, что эти цепи имеют сходную стоимость по отношению к (regex может быть сложнее, в зависимости от которого ты нуждался)):

[/user/login, /api/merchants/\d*, /api/accounts/\d*]

И заменять в твоем методе эту часть:

if (!excludeFromFilter.contains(path)) {
    ...
}

из-за:

if (shouldBeExcluded(path)) {
    //...
}

Также, ты объявляешь метод shouldBeExcluded.

Java 8:

boolean shouldBeExcluded(String path) {
    return listaRegex.stream() //convertir a Stream
        .filter(p -> p.matcher(path).matches() ) //filtrar aquellos que cumplan con el patrón de regex y evaluar que el regex hace match con la url que indicas
        .findFirst() //devuelve el primer elemento en el stream luego de aplicar el filtro. Acción lazy, es decir, no evalúa todos los elementos para obtener el primero, al encontrar uno se detiene. Esto devuelve un Optional.
        .isPresent(); //verificar si existe un elemento devuelvo
}

Java 7 или pre:

boolean shouldBeExcluded(String path) {
    boolean result = false;
    for (Pattern pattern : listaRegex) {
        if (pattern.matcher(path).matches()) {
            result = true;
            break;
        }
    }
    return result;
}
1
ответ дан 24.11.2019, 14:39
  • 1
    Спасибо @Luiggi, извинение вопрос это функционирует для Java 1.8, проект, в котором работа должна работать с Java 1.7. Ты знаешь какую-то альтернативу? – AndreFontaine 02.04.2016, 00:38
  • 2
    @AndreFontaine обновленный –  02.04.2016, 00:42
  • 3
    Если хотят заработать какие-то nanosegundos/milisegundos ... в‘ Каждая инстанция Pattern быть должным и # 237; чтобы быть составленным однажды. Например, в начало aplicaci и # 243; n. в‘Ў versi и # 243; n для Java 7 из shouldBeExcluded - м и # 225; s быстрый, что versi и # 243; n Java 8, такие как est и # 225; n воплощенных aqu и # 237;. ☺ – Paul Vargas 02.04.2016, 01:07
  • 4
    @PaulVargas я не вижу ссылку для точки в‘Ў –  02.04.2016, 01:09