Есть ли способ оптимизировать поиск элемента внутри карты с потоком Java? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть хэш-карта, состоящая из строки в качестве ключа и списка объектов в качестве значения. Мне нужно извлечь записи, которые имеют определенную строку в качестве ключа из этого списка. Также в списке значений, содержащихся в каждой записи, мне нужны записи, у которых для определенного атрибута установлено значение true.

Я уже разработал рабочее решение с потоками Java. Поскольку этот код используется в критической задаче, касающейся времени выполнения, мне было интересно, нельзя ли было оптимизировать мой код, чтобы сделать его быстрее.

private HashMap<String, List<RewriteBase>> rewriteUrl;

public static class RewriteBase {
    @NotNull
    private String  urlRegex;
    @NotNull
    private String  proxyPres;
    private boolean enable;
    private boolean insensitive;
}

Map<String, List<RewriteBase>> rewriteBaseList = GetRewriteUrl();

Map<String, List<RewriteBase>> result = rewriteBaseList.entrySet().stream()
    .filter(valore -> path.startsWith(valore.getKey()))
    .collect(Collectors.toMap(Entry::getKey, p -> p.getValue().stream()
    .filter(value -> value.isEnable()).collect(Collectors.toList())));

Источник данных:

rewriteUrl:
    '[/urla/urlb/sc]':
    -
        urlRegex: /prea/sc
        proxyPres: /evm
        enable: true
        insensitive: true
    -
        urlRegex: header-logo
        proxyPres: /evm
        enable: false
        insensitive: true
    '[/urlc/urld/sc/filter]':
    -
        urlRegex: /utlnot/sc
        proxyPres: /evm
        enable: true
        insensitive: true

Это yml-файл, который отображается в классе RewriteBase и вставляется в HashMap rewriteUrl. Предполагая, что ключом для поиска является "/ urla / urlb / sc", я ожидаю в результате HashMap с "/ urla / urlb / sc" в качестве ключа и в качестве значения списка, содержащего только запись с разрешением, установленным в true , На практике это:

rewriteUrl:
    '[/urla/urlb/sc]':
    -
        urlRegex: /prea/sc
        proxyPres: /evm
        enable: true
        insensitive: true

В настоящее время я получаю правильный результат, но я думаю, что мой код можно улучшить и сделать быстрее.

1 Ответ

0 голосов
/ 10 мая 2019

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

rewriteBaseList.keySet().removeIf(k -> !path.startsWith(k)); // updating the source map
rewriteBaseList.values().removeIf(v -> v.removeIf(r -> !r.isEnable()) && v.isEmpty());
...