|
21 | 21 | import java.util.ArrayList;
|
22 | 22 | import java.util.Collection;
|
23 | 23 | import java.util.ConcurrentModificationException;
|
| 24 | +import java.util.HashMap; |
24 | 25 | import java.util.HashSet;
|
25 | 26 | import java.util.LinkedHashMap;
|
26 | 27 | import java.util.List;
|
@@ -459,9 +460,10 @@ public void remove(final int index) {
|
459 | 460 | */
|
460 | 461 | public static class Hash extends AbstractValueType {
|
461 | 462 |
|
462 |
| - private final Map<String, Value> map = new LinkedHashMap<>(); |
| 463 | + private static final Map<String, Map<String, Boolean>> TRIE_CACHE = new HashMap<>(); |
| 464 | + private static final SimpleRegexTrie<String> TRIE = new SimpleRegexTrie<>(); |
463 | 465 |
|
464 |
| - private final SimpleRegexTrie<String> trie = new SimpleRegexTrie<>(); |
| 466 | + private final Map<String, Value> map = new LinkedHashMap<>(); |
465 | 467 |
|
466 | 468 | /**
|
467 | 469 | * Creates an empty instance of {@link Hash}.
|
@@ -695,8 +697,12 @@ private Stream<String> findFields(final String pattern) {
|
695 | 697 | }
|
696 | 698 |
|
697 | 699 | private <T> T matchFields(final String pattern, final BiFunction<Stream<String>, Predicate<String>, T> function) {
|
698 |
| - trie.put(pattern, pattern); |
699 |
| - return function.apply(map.keySet().stream(), f -> trie.get(f).contains(pattern)); |
| 700 | + final Map<String, Boolean> matcher = TRIE_CACHE.computeIfAbsent(pattern, k -> { |
| 701 | + TRIE.put(k, k); |
| 702 | + return new HashMap<>(); |
| 703 | + }); |
| 704 | + |
| 705 | + return function.apply(map.keySet().stream(), f -> matcher.computeIfAbsent(f, k -> TRIE.get(k).contains(pattern))); |
700 | 706 | }
|
701 | 707 |
|
702 | 708 | }
|
|
0 commit comments